Дуплексный сервис WCF с использованием net tcp: "Требуется безопасность потока..."
Я пишу сервис, который позволяет пользователям регистрироваться и получать уведомления, когда происходит событие. Я пытаюсь сделать это с помощью netTcpBinding, но продолжаю сталкиваться с ошибками даже при работе на моей локальной машине.
Когда я пытаюсь отправить уведомление, у меня возникает тайм-аут, получая эту ошибку:
Stream Security требуется по адресу http://www.w3.org/2005/08/addressing/anonymous, но контекст безопасности не обсуждался. Это, вероятно, вызвано тем, что удаленная конечная точка пропускает StreamSecurityBindingElement из своей привязки.
Для тестирования я размещаю сервис в консоли, и он открывается для меня, и я вижу WSDL и запускаю на нем svcutil. Когда я запускаю клиент и пытаюсь отправить уведомление, появляется ошибка, указанная выше.
Host App.config:
<system.serviceModel>
<services>
<service name="CompanyName.WebServices.InterventionService.RegistrationService"
behaviorConfiguration="RegistrationServiceBehavior">
<endpoint address="http://localhost:8000/CompanyName/Registration"
binding="wsDualHttpBinding"
contract="CompanyName.WebServices.InterventionService.Interfaces.IRegistrationService"/>
<endpoint address="net.tcp://localhost:8001/CompanyName/Registration"
binding="netTcpBinding"
contract="CompanyName.WebServices.InterventionService.Interfaces.IRegistrationService"/>
</service>
<service name="CompanyName.WebServices.InterventionService.NotificationService"
behaviorConfiguration="NotificationServiceBehavior">
<endpoint address="http://localhost:8010/CompanyName/Notification"
binding="wsDualHttpBinding"
contract="CompanyName.WebServices.InterventionService.Interfaces.INotificationService"/>
<endpoint address="net.tcp://localhost:8011/CompanyName/Notification"
binding="netTcpBinding"
contract="CompanyName.WebServices.InterventionService.Interfaces.INotificationService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="RegistrationServiceBehavior">
<serviceMetadata httpGetEnabled="true"
httpGetUrl="http://localhost:8000/CompanyName/Registration"/>
</behavior>
<behavior name="NotificationServiceBehavior">
<serviceMetadata httpGetEnabled="true"
httpGetUrl="http://localhost:8010/CompanyName/Notification"/>
</behavior>
<behavior name="netTcpRegistrationServiceBehavior">
<serviceMetadata httpGetEnabled="true"
httpGetUrl="net.tcp://localhost:8001/CompanyName/Registration"/>
</behavior>
<behavior name="netTcpNotificationServiceBehavior">
<serviceMetadata httpGetEnabled="true"
httpGetUrl="net.tcp://localhost:8011/CompanyName/Notification"/>
</behavior>
</serviceBehaviors>
</behaviors>
Вот клиент App.config:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IRegistrationService">
<security mode="None">
<message clientCredentialType="None"/>
<transport clientCredentialType="None"/>
</security>
</binding>
<binding name="NetTcpBinding_INotificationService">
<security mode="None">
<message clientCredentialType="None"/>
<transport clientCredentialType="None"/>
</security>
</binding>
</netTcpBinding>
<wsDualHttpBinding>
<binding name="WSDualHttpBinding_IRegistrationService">
<reliableSession ordered="true"/>
<security mode="None">
<message clientCredentialType="None" negotiateServiceCredential="false"/>
</security>
</binding>
<binding name="WSDualHttpBinding_INotificationService">
<reliableSession ordered="true"/>
<security mode="None">
<message clientCredentialType="None" negotiateServiceCredential="false"/>
</security>
</binding>
</wsDualHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8000/GPS/Registration"
binding="wsDualHttpBinding"
bindingConfiguration="WSDualHttpBinding_IRegistrationService"
contract="IRegistrationService"
name="WSDualHttpBinding_IRegistrationService">
</endpoint>
<endpoint address="net.tcp://localhost:8001/GPS/Registration"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IRegistrationService"
contract="IRegistrationService"
name="NetTcpBinding_IRegistrationService">
</endpoint>
<endpoint address="http://localhost:8010/GPS/Notification"
binding="wsDualHttpBinding"
bindingConfiguration="WSDualHttpBinding_INotificationService"
contract="INotificationService"
name="WSDualHttpBinding_INotificationService">
</endpoint>
<endpoint address="net.tcp://localhost:8011/GPS/Notification"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_INotificationService"
contract="INotificationService"
name="NetTcpBinding_INotificationService">
</endpoint>
</client>
Я пропустил большую часть регистрационного кода, так как сейчас только пытаюсь заставить работать уведомление.
Планируется разместить его в службе Windows Server 2003 Server, которая не является частью домена клиента (их настройка), и клиентские компьютеры будут находиться в домене клиента.
Редактировать:
Я добавил привязки в App.config хоста:
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IRegistrationService">
<security mode="None">
<message clientCredentialType="None"/>
<transport clientCredentialType="None"/>
</security>
</binding>
<binding name="NetTcpBinding_INotificationService">
<security mode="None">
<message clientCredentialType="None"/>
<transport clientCredentialType="None"/>
</security>
</binding>
</netTcpBinding>
<wsDualHttpBinding>
<binding name="WSDualHttpBinding_IRegistrationService">
<reliableSession ordered="true"/>
<security mode="None">
<message clientCredentialType="None" negotiateServiceCredential="false"/>
</security>
</binding>
<binding name="WSDualHttpBinding_INotificationService">
<reliableSession ordered="true"/>
<security mode="None">
<message clientCredentialType="None" negotiateServiceCredential="false"/>
</security>
</binding>
</wsDualHttpBinding>
</bindings>
Это по-прежнему ошибки, при этом в Steam Security требуется сообщение об ошибке. Попытка небольшого подмножества этого приложения в новом решении.
2 ответа
Что ж, ваша проблема выглядит так:
на стороне сервера вы используете привязку netTCP по умолчанию без параметров - вы ничего не меняете на ней.NETTCP по умолчанию обеспечивает безопасность на транспортном уровне с учетными данными Windows
на вашем клиенте, однако, вы явно отключаете любую защиту на привязке netTCP
Таким образом, эти два не совпадают и не согласны с тем, что делать.
Либо вам нужно отключить все средства безопасности на обоих концах - сервер И клиент - либо вам просто нужно использовать безопасные значения по умолчанию (с учетными данными Windows).
Марк
Я думаю, оказывается, что это одно из тех ужасных сообщений об ошибках, которое ведет вас во многих разных направлениях. Приведенные выше ответы верны для этого случая. Мой случай был другим - мои настройки безопасности были идентичны на клиенте и служат.
В моем случае эта ссылка указала на мой конкретный недостаток: http://www.netframeworkdevs.com/windows-communication-foundation-wcf/error-invoking-service-with-a-net-tcp-binding-123918.shtml.
Мой app.config на стороне сервиса для конечной точки bindingName
в качестве атрибута для обозначения конфигурации привязки... вместо bindingConfiguration
, Я не думаю, что даже есть атрибут с именем bindingName на endpoint
,
Итак... мое мнение состоит в том, что эта ошибка означает "есть ошибка конфигурации WCF", возможно, суженная до конфигурации на стороне службы. Тьфу.