Как использовать сокет-клиент с сервисом WCF (net.tcp)? - PullRequest
39 голосов
/ 13 февраля 2009

Я разработал службу WCF, которая использует адаптер net.tcp и прослушивает определенный порт. Я хочу подключиться к этой службе с помощью обычного клиента .net, который использует сокеты для отправки данных в порт и прослушивания ответов.
Когда я пытаюсь отправить данные в эту службу, я получаю сообщение об ошибке: «Существующее соединение было принудительно закрыто удаленным хостом».
Однако я могу подключиться к услуге другим клиентом, который использует адрес / привязку / контракты службы WCF.
Есть ли способ, который позволяет мне общаться со службой WCF с помощью обычного клиента на основе сокетов?

Ответы [ 3 ]

51 голосов
/ 14 февраля 2009

Ключевое решение заключается в том, чтобы служба WCF соответствовала клиенту сокета или нет, чтобы клиент сокета соответствовал службе WCF.

Будет проще попытаться соответствовать службе WCF, чем пытаться реализовать что-то настраиваемое в WCF, что никогда не бывает легко. Внизу раздела «Другие ресурсы» ниже вы увидите ссылку, описывающую проверку сообщений, которая необходима для того, чтобы попытаться соответствовать службе WCF.

Сказав это, сокеты .NET изначально не взаимодействуют с WCF.

Любая попытка сделать это потребует пользовательского программирования на стороне WCF.

Неважно, используете ли вы TcpClient или необработанные сокеты в .NET для подключения и взаимодействия с WCF. Любая такая совместимость должна обрабатываться с помощью пользовательской логики в WCF. Обратите внимание, что Net.Tcp - это собственный транспортный протокол. Технически это не использует TCP так же, как TcpClient.

Например, UDP очень часто используется серверами сокетов в мире Linux. WCF не предоставляет встроенный транспорт UDP. Однако есть пример UDP для WCF, который реализует UDP для WCF. К сожалению, этот пример не иллюстрирует взаимодействие с сервером сокетов UPD, отличным от WCF.

У меня остался довольно подробный вопрос, в котором я объясняю свои усилия, направленные на то, чтобы пример кода был в общем тестируемым для использования UDP ...

Можно ли заставить WcfTestClient работать для пользовательских транспортных каналов?

Никто еще не ответил на мой вопрос. Так что, если вам удастся сделать эту работу, я очень заинтересован. Мой случай был вызван желанием, чтобы служба WCF могла обращаться к серверу сокетов UDP, работающему в Linux, без необходимости загромождать мой сервис кодированием, отличным от WCF. Я не хочу смешивать подходы.

Другие ресурсы ...

  • Выбор транспорта
    В этой статье говорится, что "транспорт WCF TCP оптимизирован для сценарий, где оба конца общение используют WCF ".

    http://msdn.microsoft.com/en-us/library/ms733769.aspx

  • Попытка подключить не-WCF-клиента к службе WCF который использует BasicHttpBinding.
    Разработчик заканчивает писать собственный код через WebClient (в отличие от TcpClient).

    http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c2d72c2d-c095-4ae1-b8ae-d15f32a4e0be/

  • WCF против Raw .NET Sockets
    Ответ указывает на то, что TCP + двоичная сериализация или UDP + двоичная сериализация может быть необходима. Там пример привязки UDP, как я упомянутый выше.

    http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c0520111-c1ca-4ffd-a4e0-ac68e86130ee/

  • Запись пользовательских запросов в простой WCF Услуги
    Автор объясняет, как выяснить формат сообщения, нужно отправить в сервис, поэтому что TcpClient или другой не-WCF сокеты клиент может отправить запись информация для службы WCF. Подразумевается, что вы не пытаясь соответствовать WCF сервис, а скорее вы заставляете сокет-клиент, чтобы сделать тяжелый лифтинг. Тем не менее, вы не получите встроенные преимущества WCF привязки, если вы ожидаете что.

    http://blogs.msdn.com/carlosfigueira/archive/2008/01/13/writing-custom-requests-to-simple-wcf-services.aspx

6 голосов
/ 14 февраля 2009

Привязка Net.TCP использует пользовательский формат кадрирования на уровне проводов, который на самом деле не задокументирован, хотя Николас Аллен недавно начал серию публикаций по этой теме. Серия начинается здесь: http://blogs.msdn.com/drnick/archive/2009/01/19/message-framing-part-1.aspx

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

0 голосов
/ 13 февраля 2009

Hy,

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

В этом случае отключите режим безопасности для вашей привязки:

<netTcpBinding>
   <binding name="MyCustomBinding"> 
      <security mode="None" /> 
   </binding> 
</netTcpBinding>

Но лучше было бы работать с сертификатами.

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