Проблемы WCF с wsDualHttpBinding и netTcpBinding за межсетевыми экранами

У меня есть автономная служба WCF, работающая на сервере за брандмауэром. В настоящее время он использует wsDualHttpBinding, поскольку служба использует обратные вызовы. Клиент отлично работает в локальной сети. Мы открыли брандмауэр, чтобы разрешить трафик на настраиваемый порт, и теперь обнаружение службы работает из-за пределов локальной сети.

Из-за характера wsDualHttpBinding это явно не может работать, если клиент находится за собственным брандмауэром. Естественно, приходит на ум netTcpBinding, который должен решить проблему двунаправленности. Но странно то, что когда XML конфигурации службы обновляется, чтобы включить netTcpBinding в тот же порт (и / или исключить wsDualHttpBinding), тогда даже обнаружение службы больше не работает.

Мне интересно, есть ли еще что-нибудь, чего мне не хватает. Я последовал точному совету по настройке из Как: использовать netTcpBinding с проверкой подлинности Windows и сообщением Безопасность при вызове WCF из Windows Forms и из Windows Communication Foundation QuickStart - Multiple Binding VS2010.

Конфигурация:

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="NetTcpBindingEndpointConfig">
        <security mode="Message" />
      </binding>
    </netTcpBinding>
  </bindings>
  <services>
    <service name="Service1.Service1.Service">
      <endpoint address="Service1" binding="wsDualHttpBinding" contract="Service1.IService1">
        <identity>
          <dns value="localhost"/>
        </identity>
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      <endpoint address="" binding="netTcpBinding"
                 bindingConfiguration="NetTcpBindingEndpointConfig"
                 name="NetTcpBindingEndpoint" contract="Service1.IService1">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost:9999/Service1.Service1/"/>
          <add baseAddress="net.tcp://localhost:9999/Service1.Service1/" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <!-- To avoid disclosing metadata information, 
        set the value below to false and remove the metadata endpoint above before deployment -->
        <serviceMetadata httpGetEnabled="True"/>
        <!-- To receive exception details in faults for debugging purposes, 
        set the value below to true.  Set to false before deployment 
        to avoid disclosing exception information -->
        <serviceDebug includeExceptionDetailInFaults="True"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

person wpfwannabe    schedule 25.04.2012    source источник
comment
Что именно вы подразумеваете под обнаружением сервисов? Вы используете механизмы WS-Discovery из WCF 4?   -  person Ladislav Mrnka    schedule 25.04.2012
comment
Нет, возможно, я использовал неправильный термин. Под обнаружением я действительно имел в виду, что добавление ссылки на службу прошло успешно.   -  person wpfwannabe    schedule 25.04.2012
comment
Покажите всю свою конфигурацию для услуги.   -  person Ladislav Mrnka    schedule 25.04.2012
comment
Вы должны использовать разные порты для http и net.tcp, если хотите открыть оба базовых адреса.   -  person Ladislav Mrnka    schedule 25.04.2012
comment
Хорошо спасибо. Я действительно отправил вам старую конфигурацию. Но рассмотрим сценарий, в котором wsDualHttpBinding и его базовый адрес полностью закомментированы (или удалены), поэтому остается только netTcpBinding. Почему это не сработает?   -  person wpfwannabe    schedule 25.04.2012
comment
Поскольку у вас все еще есть mexHttpBinding и httpGetEnabled="true" - для этих двух требуется HTTP, и он должен быть открыт на другом порту, чем TCP.   -  person Ladislav Mrnka    schedule 25.04.2012
comment
Итак, что мне действительно нужно сделать, чтобы сократить конфигурацию до чистой netTcpBinding конфигурации? Не могли бы вы добавить ответ, если считаете, что это правильно?   -  person wpfwannabe    schedule 25.04.2012
comment
Почему бы вам просто не использовать другой порт для HTTP и не попробовать еще раз?   -  person Ladislav Mrnka    schedule 25.04.2012
comment
В моем распоряжении единственный порт. Если я явно не могу использовать порт для двух привязок, я бы предпочел использовать только netTcpBinding. Ты все равно мне очень помог. Буду признателен, если вы составите свой ответ, и я отмечу его ...   -  person wpfwannabe    schedule 25.04.2012


Ответы (1)


Если вы можете использовать только один порт и должны использовать netTcpBinding, попробуйте настроить службу следующим образом:

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="NetTcpBindingEndpointConfig">
        <security mode="Message" />
      </binding>
    </netTcpBinding>
  </bindings>
  <services>
    <service name="Service1.Service1.Service">
      <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
      <endpoint address="" binding="netTcpBinding"
                 bindingConfiguration="NetTcpBindingEndpointConfig"
                 name="NetTcpBindingEndpoint" contract="Service1.IService1">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:9999/Service1.Service1/" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="False"/>
        <serviceDebug includeExceptionDetailInFaults="True"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

При добавлении ссылки на услугу попробуйте использовать этот адрес:

net.tcp://localhost:9999/Service1.Service1/mex
person Ladislav Mrnka    schedule 25.04.2012
comment
Позвольте мне просто добавить к этому, что в моем конкретном сценарии несколько служб были размещены в группе, поэтому явно был конфликт портов. К счастью, я нашел this, который помог мне понять, что мне также нужен portSharingEnabled="true" на моем binding. Я также изменил mex, чтобы использовать тот же общий netTcpBinding. - person wpfwannabe; 25.04.2012