Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[c#] Server / Client (на асинхронных сокетах) + MSSQL

18K
28 ноября 2011 года
imAlex
179 / / 29.07.2010
Доброго времени суток.
У меня есть сервер + клиент на асинхронных сокетах.
По запросу клиента, сервер должен сделать запрос к базе (MSSQL) и вернуть клиенту результат.
Как это можно осуществить?
18K
28 ноября 2011 года
imAlex
179 / / 29.07.2010
PS: интересует именно момент передачи результата. То-есть принимать запрос от клиента (серверной частью) -> делать запрос к базе и получать от нее ответ, я программу научил. Вот теперь не могу понять как результат передавать клиенту.
14
28 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
Смотря что предполагается внутри этого результата..
18K
28 ноября 2011 года
imAlex
179 / / 29.07.2010
Цитата: Phodopus
Смотря что предполагается внутри этого результата..


Результат - таблица данных.
То-есть клиент, получив результат, должен отобразить его в dataGrid-е.

5
29 ноября 2011 года
hardcase
4.5K / / 09.08.2005
Вариант 1 (простой): бинарная/XML/JSON сериализация данных в сокет.
Вариант 2 (правильный): сворачивать лисапед-инжиниринг и использовать WCF.
14
29 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
Я вообще не понимаю почему нельзя сделать запрос к MSSQL напрямую, а не воротить эти инсекюрные велосипеды.
5
29 ноября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Phodopus
Я вообще не понимаю почему нельзя сделать запрос к MSSQL напрямую, а не воротить эти инсекюрные велосипеды.


ТС видимо тренеруется трехзвенки делать.

18K
29 ноября 2011 года
imAlex
179 / / 29.07.2010
Цитата: Phodopus
Я вообще не понимаю почему нельзя сделать запрос к MSSQL напрямую, а не воротить эти инсекюрные велосипеды.


Не хочется давать прямой доступ к базе.

Цитата:
Вариант 2 (правильный): сворачивать лисапед-инжиниринг и использовать WCF.


Можно по подробнее про данный способы.

18K
29 ноября 2011 года
imAlex
179 / / 29.07.2010
Я тут задумался...
А как вообще это обычно реализуют? То-есть как сделать правильно?
В голову мне приходят следующие варианты:
1) Серверная часть, получив данные, разбивает их на строки и ячейки -> передает клиенту, и он уже сам все склеивает как надо.
Мне кажется минусы:[INDENT]на каждый тип такого запроса надо делать свой обработчик;
увеличение времени обработки запроса серверной частью.[/INDENT]Плюс:[INDENT]минимальные размеры пакетов, поскольку передаем только необходимое.[/INDENT]2) Серверная часть, получив данные, преобразует их в DataTable -> затем в бинарный код -> передает клиенту.
Минусы:[INDENT]придется передавать кучу мусора, которой обрастают данные при переводе в DataTable;
не знаю возможно ли вообще перевести DataTable и бинарный код.[/INDENT]Плюс:[INDENT]универсальность.[/INDENT]3) Серверная часть, получив данные в SqlDataReader -> переводит их в бинарный код ->передает клиенту.... Этот вариант по идее нечто среднее между первым и вторым вариантом в описанных мною аспектах. Правда все равно не понятно, как SqlDataReader перевести в бинарный код.

Вариант, когда клиент в обход серверной части лезет в базу, мне кажется не уместным с точки зрения безопасности. Да и вообще, а если клиент и серверная часть стоят в разных подсетях? Это надо по мимо порта для серверной части открывать еще и к базе. Защищать все от атак из вне...
А если доступ имеет только клиент через серверную часть, то пусть она (серверная часть) и занимается безопасностью.
5
29 ноября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: imAlex
Не хочется давать прямой доступ к базе.

Гммм в SqlServer можно гибко права раздавать, например сделать учетку, которая может дергать ограниченный набор хранимых процедур.

Цитата: imAlex
Можно по подробнее про данный способы.

MSDN вам в помощь, примеров достаточно.

18K
29 ноября 2011 года
imAlex
179 / / 29.07.2010
Я почитал msdn, почитал еще статейки в сети...
На сколько я понял, WCF некая альтернатива сокетам. Это так?
Я попробовал создать проект как описано на msdn-е, вот только не понял, как получать доступ с сети? Я пробовал в app.config-е прописывать для клиентского приложения IP и порт компа где стоит сервис, ничего не получилось (естественно типы подключения я менял на tcp).

И все-же
Цитата:
А как вообще это обычно реализуют? То-есть как сделать правильно?

5
30 ноября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: imAlex
Я почитал msdn, почитал еще статейки в сети...
На сколько я понял, WCF некая альтернатива сокетам. Это так?

WCF, конечно использует сокеты, он - альтернатива рукопашной реализации прикладных протоколов.

Цитата: imAlex
Я попробовал создать проект как описано на msdn-е, вот только не понял, как получать доступ с сети? Я пробовал в app.config-е прописывать для клиентского приложения IP и порт компа где стоит сервис, ничего не получилось (естественно типы подключения я менял на tcp).

Вы бы хоть настройки привели :) WCF позволяет настроить невероятно много параметров.

Цитата: imAlex
И все-же

Правильно - не изобретать своих решений, а разумно использовать те, что уже предоставляет платформа, особенно когда они отлично подходят вашу задачу.

18K
30 ноября 2011 года
imAlex
179 / / 29.07.2010
Спасибо за ответ. Это конечно не совсем то, что я ожидал, но полностью удовлетворяет поставленный вопрос.
Для уточнения:
пишу сервер клиент. Основные задачи: передача данных (те самые таблицы с БД), передача файлов, передача текстовых сообщений. Так-же должна быть реализована возможность "многопользовательского режима" - много клиентов (условно 50) одновременно обращаются к одной серверной части. Возможность ограничения прав (создание груп пользователей, которые например не могут отправлять файлы... и т.д.).
Все это должно работать по сети. Вот собственно вся задача.
На данный момент я реализовал все кроме связи с базой.

Так мне все-же стоит копать в сторону WCF-а?

Цитата:
Вы бы хоть настройки привели WCF позволяет настроить невероятно много параметров.


Текст файла щас не могу привести, нет под рукой.
Менял:
- mexHttpBinding на mexTcpBinding
- wsHttpBinding на wsTcpBinding
- serviceMetadata httpGetEnabled="true" на false
- baseAddress="http://localhost:8080/SampleService на baseAddress="net.tcp://< МОЙ IP>:<МОЙ ПОРТ>/SampleService

18K
23 декабря 2011 года
imAlex
179 / / 29.07.2010
Цитата: hardcase
Вариант 2 (правильный): сворачивать лисапед-инжиниринг и использовать WCF.



А что имелось в веду под "лисапед-инжиниринг"?

14
23 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
изобретание лисапедов, как я полагаю
18K
24 декабря 2011 года
imAlex
179 / / 29.07.2010
Информативно )))
Но все же, может метод какой.. или направление хоть покажите.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог