Будет ли использование WSDualHttpBinding для дуплексных обратных вызовов работать в реальных сценариях? Скажем, у меня есть приложение .NET, которое использует случайный порт, сможет ли служба разрешить базовые адреса и порт для обратных вызовов?
WSDualHttpBinding для двусторонних обратных вызовов
Ответ 1
Полный ответ на ваш вопрос зависит от "реального сценария", который является либо интрасети, либо интернет-сценарием. Хотя WSDualHttpBinding работает в обоих сценариях, есть особенности, которые необходимо знать:
Intranet
WSDualHttpBinding будет работать с вашим .NET-приложением, используя предварительно сконфигурированный пользовательский порт в сценарии Intranet, и "Да" служба сможет разрешать базовые адреса и порт для обратных вызовов: как это объясняется ниже. Причина, объясняемая ниже, заключается в том, что WSDualHttpBinding в первую очередь предназначен для использования через Интернет.
Дуплексные обратные вызовы в сценарии Intranet, когда вы можете использовать WCF как на клиенте, так и на сервере, лучше всего использовать с помощью NetTcpBinding или NetNamedPipeBinding. Эти привязки используют TCP и ICP соответственно как транспорт (а не HTTP) и пользовательскую двоичную кодировку, поэтому WCF требуется с обеих сторон. Для обратного вызова клиенту используется тот же канал, который используется для подключения к службе через привязку, без необходимости открытия нового порта.
Интернет
В сценарии Интернета действительные HTTP-запросы и ответы распространяются только в одном направлении, HTTP-протокол - односторонний. Поэтому при использовании WSDualHttpBinding WCF создает отдельный HTTP-канал для обратных вызовов. В ответ на ваш второй вопрос: адрес назначения для этого обратного вызова клиенту состоит из имени хоста клиентского компьютера и порта 80 по умолчанию. Если клиент является, например, машиной разработки и установлен IIS, порт 80 будет зарезервирован исключительно в некоторых сценариях, что вызовет конфликты с вашим прототипом. Это то, что это сообщение в блоге представляет собой решение для и с чем связано свойство ClientBaseAddress. Независимо от того, с каким портом вы работаете - по умолчанию или с обычным, вы должны убедиться, что все брандмауэры и маршрутизаторы с обеих сторон настроены правильно, чтобы установить как исходящий канал, так и отдельный канал обратного вызова.
Приложение .NET также может обозначать приложение Silverlight. Из-за того, что приложение Silverlight, работающее в браузере, не может принимать новые входящие HTTP-соединения, WSDualHttpBinding с ним отдельный обратный канал не будет работать. Следовательно, PollingDuplexHttpBinding был создан во-первых в Silverlight 2, который можно рассматривать как умный "трюк", чтобы обойти тот факт, что HTTP является однонаправленным, сохраняя канал запроса долгое время (длительный опрос) и используя его в качестве обратного канала для обращается к клиенту. Это имеет ряд последствий как на стороне клиента, так и на стороне сервера, особенно актуальной для масштабирования, более подробно см. этот пост из моего блога.
С идеей вашего конкретного "сценария реального мира" и ваших прецедентов, надеюсь, это поможет вам выработать правильную привязку для использования для дуплексных обратных вызовов.
Ответ 2
Если это приложение за брандмауэром, теоретически да. Это зависит от того, что вы подразумеваете под "реальным миром"; если под этим вы подразумеваете "высокую производительность", возможно, NetTcpBinding - лучшая оценка.