Можно ли иметь хост службы WCF, не связанный с каким-либо конкретным типом сервиса? - PullRequest
1 голос
/ 07 марта 2011

Этот пост несколько связан с моим предыдущим постом .

Короче говоря, я пытаюсь создать http-привязку обратного опроса, где хост опрашивает своих клиентов на предмет запросов.Я использую код из http://archive.msdn.microsoft.com/duplexhttp в качестве справки.Теперь в этой привязке хост на самом деле является клиентом, а клиенты на самом деле серверами.Это означает, что клиент, использующий эту HTTP-привязку обратного опроса, должен в конечном итоге получить скрытый Service Host, предоставляющий средство перекачки каналов.

Теперь обычный шаблон использования типа ServiceHost требует наличия фактической реализации службы WCF.,В моем случае ServiceHost открыт на клиенте - у него нет реализации сервиса и это справедливо.

Мне интересно, как лучше всего решить эту проблему?

В идеале этот хост-сервис не нуждается в обслуживании.Хост опроса отправляет экземпляры Message, которые не сопоставлены ни с каким контрактом на обслуживание.Эти сообщения запрашиваются и отвечают по выделенным каналам - HttpPollingRequestChannel и HttpPollingReplyChannel соответственно.Но мне нужен сервисный хост для канальной насосной установки, которую он реализует.

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

Я полагаю, что для уточнения картины необходима дополнительная справочная информация.Наша система состоит из клиентов, сервера и агентов.Клиенты общаются с сервером, последний передает свои запросы агентам, которые возвращают результаты обратно на сервер.Все каналы являются прямыми HTTP - простыми и понятными.

Однако существует потребность в возможности развертывания агентов за брандмауэром без возможности открывать входящие порты на нем.Это означает, что связь между сервером и агентом больше невозможна.На мой взгляд, у меня есть два варианта:

  1. Перепроектировать протокол Сервер -> Агент, чтобы он использовал опрос.
  2. Реализация низкоуровневого связывания, которое будет использовать внутренний опрос.

Какой выбор вы бы сделали?Хотя второй вариант сложнее реализовать, это одноразовое усилие.Но у этого есть многочисленные преимущества.Является ли это возможным?Я думаю, да, потому что опрос дуплексного http-связывания уже существует как для Silverlight, так и для .NET - см. Ссылку в начале к этому сообщению.

Edit 2

Хочу еще раз подчеркнуть, что Я не хочу дуплекс .При дуплексной связи обратный вызов выполняется в контексте запроса, то есть Агент отправляет запрос, а Сервер выполняет обратный вызов.У меня дело другое.Агент ничего не отправляет.Сервер решает неожиданно связаться с Агентом.Нет активного запроса от имени Агента.Итак, существующая дуплексная привязка не подходит для меня, но я пытаюсь научиться у нее, как реализовать опрос.

Общая картина такова:

  • Агент постоянно опрашиваетСервер
  • Если Сервер хочет отправить сообщение Агенту, это сообщение ожидает следующего запроса на опрос и переходит к Агенту поверх ответа на запрос запроса.

Запросы опроса не являются частью какого-либо интерфейса, они реализованы в инфраструктуре связывания низкого уровня.

Ответы [ 3 ]

0 голосов
/ 07 марта 2011

По-моему, ты зря тратишь время.Технология не подготовлена ​​к этому.Если вы хотите дуплексную связь с клиентами, используйте шаблон публикации / подписки.Если вы хотите, чтобы только сервер вызывал клиентов, предоставьте службу клиентам и пользовательскому серверу в качестве клиента этих служб.

Почему?

  1. Это сэкономит вам огромное количество времени и бюджета
  2. Это будет работать - это проверено тысячами реальных решений
  3. Люди поймут это и помогут вам, если у вас возникнут проблемы.

Если вам действительно нужно следоватьваш сценарий отказывается от WCF и использует другую модель программирования - возможно, сокеты напрямую.

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

Хорошо, если вы все еще хотите использовать дуплексный сервис, у меня есть такая идея:

  • Используйте WsDualHttpBinding, когда агент не находится за брандмауэром
  • Используйте PollingDualHttpBinding, когда агент находится за брандмауэром - для получения этой привязки необходимо установить Silverlight 4 SDK.Он находится в отдельной сборке System.ServiceModel.PollingDuplex.dll.Вы должны зарегистрировать привязку как новое расширение привязки, если хотите использовать ее в конфигурационном файле.
0 голосов
/ 07 марта 2011

Брандмауэры являются причиной, по которой дуплексный HTTP не работает.Учитывая количество раз, когда возникает эта проблема, я действительно хотел бы, чтобы Microsoft никогда не создавала dualHttpBinding.

Решение для этого состоит в том, чтобы вместо этого использовать что-то вроде netTcpBinding, так как это допускает фактическую дуплексную связь через одно соединение(тот, который создает клиент), таким образом решая проблему брандмауэра.Если по какой-то причине вам необходимо использовать HTTP, единственный способ - агенты опросить службу.

0 голосов
/ 07 марта 2011

Во-первых, Я бы не использовал бы дуплекс на вашем месте.

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

WCF может оказаться не совсем подходящим вариантом, если вам нужна полная гибкость в сообщении. CQRS + NServiceBus может быть более подходящим, который определяет команды, и каждое сообщение будет предписывать действие, которое требуется выполнить над ним.

...