На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Трехуровневое приложение + SOAP + Entity Framework
    Всем привет!
    Занимаюсь разработкой трёхуровневого приложения - клиент, сервер и бд. База данных - 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 веб сервис либо еще чтото). Не могли бы вы дать пример кода для функций отправки и формирования сообщения на клиенте и его приёма, обработки и ответа на клиенте? или где найти можно подобное.
    Заранее спасибо.
      Цитата
      Допустим клиент хочет сделать выборку каких то полей из базы - Field_1, Field_2, Field_3 из Table_1.

      Так лучше не делать. Ибо на сервер может придти "такое", что он или завалится или забурится разгребать этот запрос.

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

      EF работает с персистентными данным следовательно его не затрудни работать с объектами DataContract, такие объекты спокойно пролезают через WCF, который может работать по протоколу SOAP и хоститься на IIS. Единственная трудность - это ассациируемыми коллекции (например, со словарями). Наверно придется оборачивать.

      Ну вот как-то так. :)
        то есть сервер делать WCF приложением, хостить его на IIS и обмениваться SOAP с клиентом?
          можно и в консольке, как угодно можно организовать WCF сервис. и клиента к нему.
            ясно. а можно пример как должны общаться клиент сервер по SOAP? допустим клиент хочет выборку из БД какойто таблицы, как надо составить сообщение и вообще как это делается? руками набирать XML ?
              эм...не привычно слышать термин "Таблиица" в контексте EF. EF мапит таблицы на сущности, следовательно у сервера и нужно спрашивать эти сущности. Вот вам и выборка одной или нескольких таблиц. Все зависит от модели данных EF. Ничего ручками делать не нужно, данные, которые ходят через WCF сериализуются/десериализуются. Следовательно вы работаете не с сообщениями, я с объектами.
                ну да, не совсем корректно сказал про EF - да, мне нужна выборка из сущности Табл1. что для этого надо сделать на клиенте чтоьы отправить такое SOAP сообщение на сервер?
                  Общая сборка между клиентом и сервером:
                  ExpandedWrap disabled
                    public interface IDbService
                    {
                      User GetUser(string _id);
                    }
                     
                    [DataContract]
                    public class User
                    {
                       [DataMember]
                       public string ID {get; set;}
                    }


                  Сервер:
                  ExpandedWrap disabled
                    [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();


                  Клиент:
                  ExpandedWrap disabled
                     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
                  Сообщение отредактировано: maxim84_ -
                    спасибо, буду разбираться.
                    а я вот сейчас еще набросал вариант сервера и клиента которые по tcp общаются - сервер слуашет какойто порт, а клиент коннесктицца на афпишник сервера и его порт, пока они сообщениеми строковыми туда сюда гоняют. можно сделать так чтоб таким же способом soap гонялись?
                      Можно конечно.
                      Тут посмотрите: http://msdn.microsoft.com/en-us/library/d5wt2he6%28v=VS.71%29.aspx

                      Выглядит ужасно, но показывает как можно использовать сериализацию и десериализацию с применим SOAP

                      Добавлено
                      еще тут: http://www.codeproject.com/KB/XML/Serialization_Samples.aspx
                        в том и проблема, что SOAP надо заюзать обязательно для обмена данными между клиентом и сервером (((
                        я так понимаю что WCF в этом не поможет? обмене по SOAP?
                          Цитата
                          я так понимаю что WCF в этом не поможет? обмене по SOAP?

                          WCF использует SOAP как раз для обмена данными между клиентом и сервером. Ну, WCF может использовать разные сериализаторы, но SOAP - одна из основных.

                          Цитата
                          в том и проблема, что SOAP надо заюзать обязательно для обмена данными между клиентом и сервером (((

                          хм...зачем? если вы сами пишите клиент и сервер...
                            тех задание такое. дословно - "Протокол коммуникации между клиентом и сервером - SOAP"
                              Тогда WCF вам в помощь. Сокеты - выкинуть. ИМХО.
                                так а это для wcf оба приложения должный на нем написаны - и сервер и клиент?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1160 ]   [ 16 queries used ]   [ Generated: 25.04.24, 01:43 GMT ]