Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.228.35] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем привет!
Занимаюсь разработкой трёхуровневого приложения - клиент, сервер и бд. База данных - MS SQL Express, клиентское приложение обычное WinForm приложение на C#, бизнес логика сервера юзает для общение с БД Entity Framework. Ну с последним все более менее понятно - EF + запросы LINQ. Проблема в обмене данными между клиентом и сервером - оно должно происходить посредством SOAP. И вот вопрос - что должен из себе представлять сервер в таком случае - ASP.NET веб сервис развернутый на IIS, или это может быть тоже обычное приложение (например консольное или библиотека), которое будет содержать методы работы с БД и будет принимать SOAP сообщения от клиента и отправлять ему ответ. Дело в том что никогда не сталкивался с SOAP, в сети инфы по самому протоколу много. но практических советом не много. Допустим клиент хочет сделать выборку каких то полей из базы - Field_1, Field_2, Field_3 из Table_1. Для этого как я понимаю должен быть метод на клиенте который будет делать SOAP сообщение и отправлять его на сервер. Допустим это методы CreateSoapSelect() и SendSoapSelect() соответственно. В это же время сервер должен принять это сообщение, обработать данные и составить ответ и отправить его на клиент? Для этого как я понимаю сервер должен постоянно либо прослушивать порт на который приходят сообщения (если сервер это ASP.NET веб сервис либо еще чтото). Не могли бы вы дать пример кода для функций отправки и формирования сообщения на клиенте и его приёма, обработки и ответа на клиенте? или где найти можно подобное. Заранее спасибо. |
Сообщ.
#2
,
|
|
|
Цитата Допустим клиент хочет сделать выборку каких то полей из базы - Field_1, Field_2, Field_3 из Table_1. Так лучше не делать. Ибо на сервер может придти "такое", что он или завалится или забурится разгребать этот запрос. Лучше сделать WCF сервис для работы с DB, интерфейс которого будет содержать методы для получения сущностный по каким-то их характеристикам. Такм образом внешний код, получает, только то что должен знать о DB и о том что можно от нее получить. EF работает с персистентными данным следовательно его не затрудни работать с объектами DataContract, такие объекты спокойно пролезают через WCF, который может работать по протоколу SOAP и хоститься на IIS. Единственная трудность - это ассациируемыми коллекции (например, со словарями). Наверно придется оборачивать. Ну вот как-то так. |
Сообщ.
#3
,
|
|
|
то есть сервер делать WCF приложением, хостить его на IIS и обмениваться SOAP с клиентом?
|
Сообщ.
#4
,
|
|
|
можно и в консольке, как угодно можно организовать WCF сервис. и клиента к нему.
|
Сообщ.
#5
,
|
|
|
ясно. а можно пример как должны общаться клиент сервер по SOAP? допустим клиент хочет выборку из БД какойто таблицы, как надо составить сообщение и вообще как это делается? руками набирать XML ?
|
Сообщ.
#6
,
|
|
|
эм...не привычно слышать термин "Таблиица" в контексте EF. EF мапит таблицы на сущности, следовательно у сервера и нужно спрашивать эти сущности. Вот вам и выборка одной или нескольких таблиц. Все зависит от модели данных EF. Ничего ручками делать не нужно, данные, которые ходят через WCF сериализуются/десериализуются. Следовательно вы работаете не с сообщениями, я с объектами.
|
Сообщ.
#7
,
|
|
|
ну да, не совсем корректно сказал про EF - да, мне нужна выборка из сущности Табл1. что для этого надо сделать на клиенте чтоьы отправить такое SOAP сообщение на сервер?
|
Сообщ.
#8
,
|
|
|
Общая сборка между клиентом и сервером:
public interface IDbService { User GetUser(string _id); } [DataContract] public class User { [DataMember] public string ID {get; set;} } Сервер: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class DbService : IDbService { object _locker = new object(); public void Init() { ... } public User GetUser(string _id) { return /*выбираем юзера и возвращаем что получится, или null*/; } } .... DbService _instance = new DbService(); _instance.Init(); ServiceHost serviceHost = new ServiceHost(_instance, new Uri(AppConfiguration.ServiceUri)); serviceHost.Open(); ... serviceHost.Close(); Клиент: EndpointAddress _endpoint = new EndpointAddress(_uri); ChannelFactory<IDbService> myChannelFactory = new ChannelFactory<IDbService>(new BasicHttpBinding(), _endpoint); _client = myChannelFactory.CreateChannel(); var _service = tmp.Open(_uri); if (_service == null) return false; var _user = _service.GetUser("TestId"); if(_user == null) Console.WriteLine("User not found"); _client.Close(); Вот как-то так. Сорри, могут быть недочеты, т.к. прям тут писал. ) Добавлено А вообще вот тут все смотри: WCF |
Сообщ.
#9
,
|
|
|
спасибо, буду разбираться.
а я вот сейчас еще набросал вариант сервера и клиента которые по tcp общаются - сервер слуашет какойто порт, а клиент коннесктицца на афпишник сервера и его порт, пока они сообщениеми строковыми туда сюда гоняют. можно сделать так чтоб таким же способом soap гонялись? |
Сообщ.
#10
,
|
|
|
Можно конечно.
Тут посмотрите: http://msdn.microsoft.com/en-us/library/d5wt2he6%28v=VS.71%29.aspx Выглядит ужасно, но показывает как можно использовать сериализацию и десериализацию с применим SOAP Добавлено еще тут: http://www.codeproject.com/KB/XML/Serialization_Samples.aspx |
Сообщ.
#11
,
|
|
|
в том и проблема, что SOAP надо заюзать обязательно для обмена данными между клиентом и сервером (((
я так понимаю что WCF в этом не поможет? обмене по SOAP? |
Сообщ.
#12
,
|
|
|
Цитата я так понимаю что WCF в этом не поможет? обмене по SOAP? WCF использует SOAP как раз для обмена данными между клиентом и сервером. Ну, WCF может использовать разные сериализаторы, но SOAP - одна из основных. Цитата в том и проблема, что SOAP надо заюзать обязательно для обмена данными между клиентом и сервером ((( хм...зачем? если вы сами пишите клиент и сервер... |
Сообщ.
#13
,
|
|
|
тех задание такое. дословно - "Протокол коммуникации между клиентом и сервером - SOAP"
|
Сообщ.
#14
,
|
|
|
Тогда WCF вам в помощь. Сокеты - выкинуть. ИМХО.
|
Сообщ.
#15
,
|
|
|
так а это для wcf оба приложения должный на нем написаны - и сервер и клиент?
|