Вызов службы WCF работает с basicHttpBinding, но завершается неудачно с netTcpBinding - PullRequest
5 голосов
/ 15 апреля 2011

(Пожалуйста, прочитайте комментарий, так как у меня есть исправление)
Привет,

Я создал службу WCF, которую я размещаю в IIS 7.5 в Windows 7, используя .net 4.0
Служба размещена как на http, так и на net.tcp.

Я протестировал свой сервис с помощью WcfTestClient, и он, кажется, работает корректно как через basicHttp, так и через netTcp.

Однако, когда я пытаюсь использовать эту службу через мой веб-сайт ASP.NET, я получаю сообщение об ошибке при попытке пройти через nettcp

Конечная точка моего клиента выглядит следующим образом

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="Generic_HttpBinding" sendTimeout="00:01:00" receiveTimeout="00:01:00" maxBufferPoolSize="2000000" maxReceivedMessageSize="2000000000">
      <security mode="None"/>
      <readerQuotas maxDepth="2000000" maxStringContentLength="2000000" maxArrayLength="2000000" maxBytesPerRead="2000000" maxNameTableCharCount="2000000"/>
    </binding>
  </basicHttpBinding>
  <netTcpBinding>
    <binding name="Generic_Binding" sendTimeout="00:01:00" receiveTimeout="00:01:00" maxBufferPoolSize="2000000" maxReceivedMessageSize="2000000000">
      <security mode="None"/>
      <readerQuotas maxDepth="2000000" maxStringContentLength="2000000" maxArrayLength="2000000" maxBytesPerRead="2000000" maxNameTableCharCount="2000000"/>
    </binding>
  </netTcpBinding>
</bindings>
<client>
  <endpoint name="EndPointHttp" address="http://localhost:43/Service/MyService.svc" binding="basicHttpBinding" bindingConfiguration="Generic_HttpBinding" contract="NameSpace.Services.Contracts.IService"></endpoint>
  <endpoint name="EndPoint" address="net.tcp://localhost:42/Service/MyService.svc" binding="netTcpBinding" bindingConfiguration="Generic_Binding" contract="NameSpace.Services.Contracts.IService"></endpoint>
</client>

Теперь я вызываю службу точно так же, просто меняя имя конечной точки

var factory = new ChannelFactory<IService>(SuppliedEndpointName);
factory.Open();
var proxy = factory.CreateChannel();
var result = proxy.SomeServiceMethod();

Если я передам этот метод, BasicHttpBinding будет работать отлично.
Когда я перехожу на nettcp, я сразу получаю эту ошибку:

Исключение: соединение с сокетом было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением тайм-аута приема удаленным хостом, или проблемой основного сетевого ресурса. Тайм-аут локального сокета был '00: 01: 00 '.

Внутреннее исключение: существующее соединение было принудительно закрыто удаленным хостом

Код ошибки: 10054

Пожалуйста, кто-нибудь может мне помочь, это сводит меня с ума.
Я определенно установил функции активации WCF HTTP и активации NON HTTP.
Я настроил привязку на HTTP и net.tcp на разных портах.
Я установил в IIS мои включенные протоколы http, net.tcp.
Я отключил свой брандмауэр. Я запустил aspnet_regiis -i для .net 4.0

HELP!


Я наконец-то обнаружил, что смена режима безопасности на транспорт устраняет проблему.
Однако в моем сервисе для него установлен режим безопасности none.
Так почему мой клиент работает только с включенным режимом безопасности?

1 Ответ

8 голосов
/ 15 апреля 2011

netTcpBinding по умолчанию транспортная безопасность с с подписью и шифрованием . Попробуйте удалить элемент security (<security mode="None"/>).


Также

Порты до 8000 (и определенно до 1024) обычно небезопасны для использования в качестве сервисов. Попробуйте использовать безопасные порты.

...