Дуплексный сервис WCF с использованием net tcp: «Требуется безопасность потока ...» - PullRequest
4 голосов
/ 14 мая 2009

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

Когда я пытаюсь отправить уведомление, у меня истекает время ожидания, появляется эта ошибка:

Безопасность потока требуется на 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 2003 Server, которая не является частью домена клиента (их настройка), и клиентские компьютеры будут находиться в домене клиента.

Edit:

Я добавил привязки в 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 ]

9 голосов
/ 14 мая 2009

Что ж, похоже, ваша проблема такова:

  • на стороне сервера вы используете связывание netTCP по умолчанию без параметров - вы ничего не меняете на нем. По умолчанию netTCP использует безопасность транспортного уровня с учетными данными Windows

  • на вашем клиенте, однако, вы явно отключаете любую защиту на привязке netTCP

Таким образом, эти двое не совпадают и не согласны с тем, что делать.

Либо вам нужно отключить всю безопасность на обоих концах - на сервере И клиенте - либо вам просто нужно использовать безопасные настройки по умолчанию (с учетными данными Windows).

Марк

3 голосов
/ 27 мая 2012

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

В моем случае эта ссылка указала на мой конкретный недостаток: 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", возможно, суженная до конфигурации на стороне службы. Тьфу.

...