Показаны сообщения с ярлыком WCF Исключения. Показать все сообщения
Показаны сообщения с ярлыком WCF Исключения. Показать все сообщения

2 июля 2017 г.

WCF service. С чего начать. Основные моменты создание службы.

Примеры, которые используются тут, можно скачать по ссылке:

https://bitbucket.org/sergey_vaulin/wcf-examples/src

Еще ссылки:

  1. WCF service. С чего начать. Основные моменты создание службы. 
  2. WCF. Callback через BasicHttpBinding без дуплексной связи.
  3. Realtime WCF Tracker вызовов клиентского приложения.
  4. Как отключить публикацию метаданных mex WCF сервисом.  

Оглавление статьи:

  1. Что такое endpoint?
  2.  Способы общения клиента с сервисом. 
  3. Канал связи клиента и сервера.  
  4. Надежные каналы связи (reliableSession).
  5. Управление состоянием службы.
  6. Управление созданием экземпляров службы.
  7. Управление временем жизни экземпляра службы атрибутами контракта.
  8. Режимы параллельной работы с экземплярами службы
  9. Регулирование нагрузки.
  10. Обработка исключений.  
  11. Обработка исключений. Продолжение работы с посредником если используется HTTP транспорт.
  12. Обработка исключений. Обертывание всех исключений в FaultException, используя IErrorHandler.
  13. Закрытие канала посредника.
  14. Использование общей сборки с контрактами.
  15. Как убрать Web Reference. Использование общей сборки с контрактами.

Введение


В данной статье хочу описать настройки, которые разработчику следует знать  перед началом создания сервиса и клиента к нему. Я исхожу из того, что читатель уже имеет представление о WCF, пользовался какими то наработками, но не углублялся в настройки Binding и сервиса.
  • Если вы являетесь новичком и хотели бы увидеть примеры служб и работу с ними, перед прочтением советую скачать и посмотреть примеры Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4/ созданные Microsoft.
  • Из книг советую читать "Создание служб WCF (Джувел Леве)", на основе которой, а так же собственном опыте будет писаться данная статья.
  • Для демонстрации можно использовать мои примеры из проекта, ссылка на который в начале статьи. 
Я не буду расписывать все процессы создания с нуля. Тут будет представлены только наиболее интересные, на мой взгляд, понятия и настройки, о которых узнал после прочтения книги, просмотра описаний на msdn и написании примеров для демонстрации.
По каждой теме я старался не просто написать определение, а сделать реальный пример с демонстрацией, что бы все стало ясно.

Основные понятия и настройки.


Что такое endpoint?


Конечной точкой называется совокупность трех элементов:
  1. Адрес сервиса. Подразумевается, что это URL, по которому располагается сам сервис.
  2. Контракт сервиса.
  3. Binding - содержит настройки работы с сервисом, протокол взаимодействия, Timeouts операций и т.д.


Способы общения клиента с сервисом.


В WCF существует три способа общения, которые обязательно надо знать:
  1. Request-reply (запрос-ответ) - это когда с клиента делает вызов метода контракта Method(), текущий поток останавливается и ждет, пока сервер обработает ваш вызов и вернет ответ и управление. При этом все происходит в синхронном режиме, вы не сможете продолжить выполнение пока не получите ответа. Если происходит исключение на стороне сервера, то оно прилетит на клиента.
  2. OneWay (или datagram) - данный способ отличается тем, что вызываемая метод контракта сторона (это может быть клиент, или сервер при дуплексной связи), не останавливается при вызове, а продолжает выполнение. Как если бы вызов практически сразу вернул результат. Иными словами мы в любом случае ожидаем доставки SOAP сообщения на противоположную сторону, но не ожидаем получения результата в ответ.
    Возможны ситуации, когда и при таком взаимодействии тоже произойдет блокировка потока на вызываемой стороне:
    • Когда при вызове, на сервере мы упираемся в какой то нагрузочный maxConcurrent* придел сервиса и наше сообщение с вызовом помещается в очередь на обслуживание. В этом случае мы будем ожидать пока вызов не встанет в обработку либо отвалимся по Timeout.
  3. Duplex - это взаимодействие в обе стороны, когда клиент может вызывать методы сервера, а сервер, используя callback контракт, может вызывать методы клиента. Что бы это понять представьте чат, вы можете напечатать сообщение и отослать его на сервер, но что делать, если сообщение напишут вам? В этом случае сервер должен инициировать передачу на ваш компьютер. Как раз таки для этого он будет вызывать callback контракта, который задается отдельно, что бы уведомить вас.


Как реализуются данные схемы общения.

  1. Request-reply. Данное поведение является "по умолчанию".

    [ServiceContract]
    internal interface IMyContract 
    {
        [OperationContract]
        void Method();
    }
    
  2. OneWay. Для того, что бы метод контракта или callback контракта стал односторонним, достаточно указать IsOneWay = true.
    [ServiceContract]
    internal interface IMyContract
    {
        [OperationContract(IsOneWay = true)]
        void Method();
    }
    
  3. Duplex. Для реализации используется свойство атрибута под названием CallbackContract.
    
    
    [ServiceContract(CallbackContract = typeof(ICallback))]
    internal interface IMyContract
    {
        [OperationContract]
        void Method1();
     
        [OperationContract(IsOneWay = true)]
        void MethodOneWay1();
    }
     
    [ServiceContract]
    internal interface ICallback
    {
        [OperationContract]
        void Method2();
     
        [OperationContract(IsOneWay = true)]
        void MethodOneWay2();
    }