[c#] Server / Client (на асинхронных сокетах) + MSSQL
У меня есть сервер + клиент на асинхронных сокетах.
По запросу клиента, сервер должен сделать запрос к базе (MSSQL) и вернуть клиенту результат.
Как это можно осуществить?
Результат - таблица данных.
То-есть клиент, получив результат, должен отобразить его в dataGrid-е.
Вариант 2 (правильный): сворачивать лисапед-инжиниринг и использовать WCF.
ТС видимо тренеруется трехзвенки делать.
Не хочется давать прямой доступ к базе.
Можно по подробнее про данный способы.
А как вообще это обычно реализуют? То-есть как сделать правильно?
В голову мне приходят следующие варианты:
1) Серверная часть, получив данные, разбивает их на строки и ячейки -> передает клиенту, и он уже сам все склеивает как надо.
Мне кажется минусы:[INDENT]на каждый тип такого запроса надо делать свой обработчик;
увеличение времени обработки запроса серверной частью.[/INDENT]Плюс:[INDENT]минимальные размеры пакетов, поскольку передаем только необходимое.[/INDENT]2) Серверная часть, получив данные, преобразует их в DataTable -> затем в бинарный код -> передает клиенту.
Минусы:[INDENT]придется передавать кучу мусора, которой обрастают данные при переводе в DataTable;
не знаю возможно ли вообще перевести DataTable и бинарный код.[/INDENT]Плюс:[INDENT]универсальность.[/INDENT]3) Серверная часть, получив данные в SqlDataReader -> переводит их в бинарный код ->передает клиенту.... Этот вариант по идее нечто среднее между первым и вторым вариантом в описанных мною аспектах. Правда все равно не понятно, как SqlDataReader перевести в бинарный код.
Вариант, когда клиент в обход серверной части лезет в базу, мне кажется не уместным с точки зрения безопасности. Да и вообще, а если клиент и серверная часть стоят в разных подсетях? Это надо по мимо порта для серверной части открывать еще и к базе. Защищать все от атак из вне...
А если доступ имеет только клиент через серверную часть, то пусть она (серверная часть) и занимается безопасностью.
Гммм в SqlServer можно гибко права раздавать, например сделать учетку, которая может дергать ограниченный набор хранимых процедур.
MSDN вам в помощь, примеров достаточно.
На сколько я понял, WCF некая альтернатива сокетам. Это так?
Я попробовал создать проект как описано на msdn-е, вот только не понял, как получать доступ с сети? Я пробовал в app.config-е прописывать для клиентского приложения IP и порт компа где стоит сервис, ничего не получилось (естественно типы подключения я менял на tcp).
И все-же
На сколько я понял, WCF некая альтернатива сокетам. Это так?
WCF, конечно использует сокеты, он - альтернатива рукопашной реализации прикладных протоколов.
Вы бы хоть настройки привели :) WCF позволяет настроить невероятно много параметров.
Правильно - не изобретать своих решений, а разумно использовать те, что уже предоставляет платформа, особенно когда они отлично подходят вашу задачу.
Для уточнения:
пишу сервер клиент. Основные задачи: передача данных (те самые таблицы с БД), передача файлов, передача текстовых сообщений. Так-же должна быть реализована возможность "многопользовательского режима" - много клиентов (условно 50) одновременно обращаются к одной серверной части. Возможность ограничения прав (создание груп пользователей, которые например не могут отправлять файлы... и т.д.).
Все это должно работать по сети. Вот собственно вся задача.
На данный момент я реализовал все кроме связи с базой.
Так мне все-же стоит копать в сторону WCF-а?
Текст файла щас не могу привести, нет под рукой.
Менял:
- mexHttpBinding на mexTcpBinding
- wsHttpBinding на wsTcpBinding
- serviceMetadata httpGetEnabled="true" на false
- baseAddress="http://localhost:8080/SampleService на baseAddress="net.tcp://< МОЙ IP>:<МОЙ ПОРТ>/SampleService
А что имелось в веду под "лисапед-инжиниринг"?
Но все же, может метод какой.. или направление хоть покажите.