Вопрос для начинающих WCF - Расходуемые асинхронные сервисы - PullRequest
4 голосов
/ 09 декабря 2008

это больше вопрос "можно ли это сделать", чем вопрос "как это делается". Я смотрю на создание сервиса (среднего уровня, .net, обеспечивающего абстракцию данных и некоторую бизнес-логику), который будет использоваться несколькими внутренними клиентскими системами на разных платформах. Например. один клиент может быть веб-сайтом, другой клиент - некоторым Java-кодом, другой клиент - C # и т. д.

Я хочу предоставить синхронный и асинхронный API в мой сервис, например, Методы GetData, BeginGetData, EndGetData. Я также хочу, чтобы клиенты могли регистрироваться для получения уведомлений о новых «данных», добавляемых в систему. В прошлом я реализовывал это, используя веб-сервисы с каналом Tibco EMS для уведомлений.

Мой вопрос таков: могу ли я выполнить три требования (синхронизация, асинхронизация и публикация / подписка), предоставив сервис WCF? Может ли эта услуга потребляться не клиентами WCF?

Извините за неопределенность этого вопроса - я могу уточнить при необходимости.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2008

Методы являются синхронными по умолчанию. Чтобы сделать их асинхронными, вам нужно добавить этот атрибут [OperationContract (AsyncPattern = true)] и вернуть IAsynchResult, как если бы вы выполняли BeginIvoke () с winforms. (подробнее здесь http://msdn.microsoft.com/en-us/library/ms734701.aspx)

Вы можете сделать публикацию / подписку с помощью так называемого контракта обратного вызова (хотя я не уверен в реализации этого на других платформах). У меня нет особого опыта с этим, но они не кажутся законченными (вы можете прочитать больше здесь http://dotnetaddict.dotnetdevelopersjournal.com/wcf_alarmclock.htm)

2 голосов
/ 10 декабря 2008

Настройка асинхронных операций в вашей службе WCF может быть выполнена как Ninja, указав AsyncPattern = true, или это может быть сделано на стороне клиента, указав svcutil генерировать асинхронные конечные точки, задав правильный аргумент командной строки или проверив опция «Создать асинхронные операции» в версии svcutil с графическим интерфейсом. Генерация асинхронных также будет генерировать синхронные операции.

Проблема с опцией асинхронного клиента заключается в том, что вам нужно будет продублировать код на Java. Svcutil экспортирует код VB или C #, как вы укажете, так что вы, скорее всего, сможете перевести код C # в Java без особой работы.

Для Pub / Sub клиентские обратные вызовы - это то, как вы хотите работать. Я использую их, и они работают очень хорошо. На корневом уровне они являются .Net Remoting и используют Eventing для передачи данных клиенту (насколько я понимаю). Я не могу подтвердить, что это может быть использовано кроссплатформенно, но это должно быть с некоторой работой.

...