Как реализованы обратные вызовы в WCF? - PullRequest
3 голосов
/ 07 декабря 2010

При выполнении асинхронных вызовов службы WCF служба может (и должна) выполнить полученный обратный вызов. Это имеет смысл в общем APM, но в случае WCF обратный вызов фактически выполняется на стороне клиента, что означает, что сервер в сущности смог выполнить код на стороне клиента.

Может кто-нибудь пролить свет на то, как это реализовано? Например, при использовании привязки http, когда служба выполняет обратный вызов, начинает ли она отправлять ответ http, который клиент WCF десериализует как сообщение для выполнения обратного вызова, и ответ завершается с возвратом метода End асинхронная операция? Может ли служба перезвонить дважды

Спасибо!

Edit: Просто чтобы убедиться, что они не запутаны, я не спрашиваю о обратных вызовах с дуплексными контрактами, но AsyncCallback передал контракт, как показано ниже (http://msdn.microsoft.com/en-us/library/ms731177.aspx):

  [OperationContractAttribute(AsyncPattern=true)]
  IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState);

  // Note: There is no OperationContractAttribute for the end method.
  string EndServiceAsyncMethod(IAsyncResult result);

Ответы [ 3 ]

4 голосов
/ 07 декабря 2010

Обратные вызовы с протоколом HTTP реализованы как составная дуплексная связь (WS-DualHttpBidning).Это означает, что обе стороны звонят друг другу по разным транспортным связям.Когда клиент вызывает сервис, он отправляет HTTP-запрос.Служба обрабатывает запрос и сохраняет канал обратного вызова для последующего использования.Затем он возвращает HTTP-ответ, который только подтверждает исходный запрос.Это не вызывает обратный вызов.Обратный вызов запускается из службы путем вызова операции на канале обратного вызова.Он создает HTTP-запрос, который отправляется с сервера на клиент.Клиент выполняет операцию обратного вызова и возвращает HTTP-ответ на сервер.

В этом потоке обмена данными используется двусторонняя схема обмена сообщениями, но при двусторонней связи обычно используется односторонний обмен сообщениями.Сервер может вызывать функцию обратного вызова клиента столько раз, сколько ему нужно (на это влияют таймауты производительности и неактивности клиента).

Для составной дуплексной связи требуется доступ как клиента, так и сервера (настройки брандмауэра для обеих сторон).На HTTP-клиент выставляет свою собственную конечную точку, которая ведет себя как другой веб-сервис.В отличие от этого net.tcp имеет дуплексный канал связи, поэтому и серверные вызовы, и вызовы обратного вызова выполняются на одном и том же TCP-соединении.

Редактировать:

Извините, я не сделалне понимаю вашего вопроса.Асинхронные операции (AsyncPattern) реализованы на сервере - реализация полностью прозрачна для клиента (обернута архитектурой службы WCF).Клиент связывается по общему шаблону HTTP-запроса / ответа, и сервис может отправлять только один ответ на каждый запрос.

WCF поддерживает два уровня асинхронной обработки - асинхронные вызовы и асинхронные операции.Первое реализовано на клиенте, и сервис не знает об этом, позднее - на сервисе, и клиент не знает об этом.Эти подходы часто объединяются в примеры, которые могут привести к путанице.

У каждого подхода есть свой собственный porpouse.Асинхронные вызовы позволяют неблокировать вызов службы, когда клиент может выполнять другие операции, пока служба обрабатывает запрос (пользовательский интерфейс не останавливается).Асинхронные операции предназначены для лучшей масштабируемости часто используемых сервисов.Синхронное выполнение блокирует поток обработки WCF до тех пор, пока выполнение не завершится, в то время как асинхронное выполнение позволяет вернуть поток обработки в пул потоков (чтобы он мог обработать другой запрос), в то время как операция выполняет некоторую трудоемкую операцию - обычно ввод-вывод или сетевое взаимодействие.

2 голосов
/ 07 декабря 2010

По сути, связь такая же, как и на сервере. «Клиентская» сторона в основном имеет конечную точку с контрактом обратного вызова, так что «сервер» может вызвать ее. Без магии.

1 голос
/ 07 декабря 2010

Клиентский стек WCF вызывает метод обратного вызова, когда получает ответ HTTP от сервера.Как сказал Алекс Ло, сервер не замечает этого - он даже не знает, что код на стороне клиента использует асинхронные вызовы: все, что он видит, это HTTP-запрос.но я представляю, что обратный вызов выполняется через порт завершения ввода-вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...