Вызов службы WCF работает с basicHttpBinding, но не работает с netTcpBinding

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

Я создал службу 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>

Now i call the service in the exact same way just swapping my end point name

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 на разных портах.
Я установил для своих включенных протоколов http, net.tcp в IIS.
Я отключил свой брандмауэр. Я запустил aspnet_regiis -i для .net 4.0

ПОМОЩЬ!


Наконец я обнаружил, что изменение режима безопасности на транспорт решает проблему.
Однако в моей службе для режима безопасности установлено значение «Нет».
Так почему же мой клиент работает только с транспортным режимом безопасности?


person WebDude    schedule 14.04.2011    source источник
comment
Обычно после нескольких часов устранения неполадок я обнаруживал проблему через несколько минут после отправки. Я скопировал конфигурацию WcfTestClient поверх своей, чтобы найти ее. Я добавил ‹security mode = None /› как для моей службы, так и для клиента. Но по какой-то причине клиентская конечная точка так не работает. Изменив его на ‹режим безопасности = Транспорт› ‹транспортный clientCredentialType = Windows protectionLevel = EncryptAndSign /› ‹message clientCredentialType = Windows /› ‹/security› Проблема устранена. У моей службы все еще нет режима безопасности. Почему?   -  person WebDude    schedule 15.04.2011
comment
Вы видите, что служба прослушивает этот порт? в netstat   -  person rerun    schedule 15.04.2011
comment
Это работало только внутренне. Я сделал несколько успешных заходов в этот порт. netstat показал, что моя служба прослушивает этот порт. В соответствии с предложением Алиостада я изменил свой порт на диапазон 4000   -  person WebDude    schedule 15.04.2011


Ответы (1)


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


Также

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

person Aliostad    schedule 14.04.2011
comment
Спасибо, это была моя проблема. Я видел это, когда WcfTestClient устанавливает режим безопасности в своем транспорте. - person WebDude; 15.04.2011