Служба WCF, размещенная в IIS, с недоступной привязкой net.tcp

Я пытаюсь разместить службу WCF с привязкой net.tcp на сайте IIS 7.5 в 64-разрядной версии Windows 7. К сожалению, услуга недоступна. Фактически, открытие соединения с TCP-портом с помощью telnet даже не удается.

Вот как выглядит мой раздел system.serviceModel файла web.config для сайта:

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DefaultServiceBehavior">
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2000000" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="DefaultServiceBehavior" 
               name="FooService">
        <endpoint binding="netTcpBinding" bindingConfiguration="service" 
                  name="service" contract="IFoo" />
        <endpoint binding="mexTcpBinding" 
                  bindingConfiguration="DuplexBinding" contract="IFoo" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://127.0.0.1:9000/service"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <bindings>
      <netTcpBinding>
        <binding name="service" portSharingEnabled="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" 
                        maxArrayLength="16384" maxBytesPerRead="4096" 
                        maxNameTableCharCount="16384" />
          <security mode="None"/>
        </binding>
        <binding name="DuplexBinding">
          <reliableSession enabled="true"/>
          <security mode="None"/>
        </binding>
      </netTcpBinding>
    </bindings>
</system.serviceModel>

В диспетчере IIS я создал сайт с пулом приложений, работающим под идентификатором NETWORK SERVICE, с .NET Framework v4.0 и интегрированным конвейером. Существует одна привязка для сайта с типом net.tcp и «Информация привязки», установленная на 9000:*.

Под службами моего компьютера я запустил ранее остановленные службы «Net.Tcp Listener Adapter» и «Net.Tcp Port Sharing Service» и заставил их запускаться автоматически. Я также удостоверился, что была установлена ​​«Активация Windows Communication Foundation без HTTP».

Что еще мне нужно сделать, чтобы IIS / WCF / WAS / все, что угодно, прослушивал порт 9000, чтобы моя служба могла быть активирована и вызвана?

Мой вопрос похож на Разместите службу WCF с привязкой net.tcp через IIS Manager 7.5, но OP не был зарегистрирован, и на его вопрос не было дано ответа. Я открываю этот вопрос, чтобы опубликовать свои собственные данные.

Обновить

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

Не удалось найти базовый адрес, соответствующий схеме net.tcp для конечной точки с привязкой NetTcpBinding. Зарегистрированные схемы базовых адресов: [http]

У меня явно есть привязки как для HTTP, так и для net.tcp:

<baseAddresses>
    <add baseAddress="net.tcp://localhost:9000/"/>
    <add baseAddress="http://localhost:8050/"/>
</baseAddresses>

Так что фраза «Зарегистрированные схемы базовых адресов» меня обеспокоила; Есть ли что-то еще, что я должен сделать, чтобы мой сайт поддерживал схему net.tcp?


person Jacob    schedule 09.11.2011    source источник
comment
Какой URL вы пытаетесь получить от клиента?   -  person Surjit Samra    schedule 10.11.2011
comment
Я пробовал net.tcp://127.0.0.1:9000/service и другие варианты, но полагаю, что если я даже не могу установить соединение с портом 9000, моя проблема не в URL-адресе.   -  person Jacob    schedule 11.11.2011
comment
попробуйте net.tcp: //127.0.0.1: 9000 / service / service   -  person Surjit Samra    schedule 11.11.2011


Ответы (4)


Наконец-то я получил IIS, позволяющий подключаться к порту 9000. Раньше я не видел эту опцию, но не знаю, потому ли это, что я провалил выборочную проверку, или мне нужно было что-то сделать, чтобы она появилась.

В расширенных настройках сайта IIS есть параметр «Включенные протоколы». Раньше было установлено просто http. После изменения на http, net.tcp я могу подключиться к TCP-порту.

person Jacob    schedule 11.11.2011

Похоже, вы все сделали правильно.

Наиболее вероятная оставшаяся проблема - это брандмауэр. Что стандартный брандмауэр Windows блокирует порт 9000.

person Shiraz Bhaiji    schedule 09.11.2011
comment
Я создал правило входящего трафика для брандмауэра Windows 7 для TCP-порта 9000, но соединение по-прежнему не работает. Что еще мне нужно сделать, чтобы обойти брандмауэр? - person Jacob; 10.11.2011
comment
@Jacob - Вы можете временно отключить брандмауэр, чтобы быть на 100% уверенным, что это не брандмауэр Windows. - person 5StringRyan; 11.11.2011
comment
К сожалению, отключение брандмауэра в моей среде запрещено. Я думаю, что сообщение об ошибке, которое я добавил в свой вопрос, может помочь в выяснении проблемы. - person Jacob; 11.11.2011

Я бы попробовал предложение SSamra. Я думаю, что ваш базовый адрес и URL-адрес, который вы пытаетесь, скорее всего, неверны. Мой выглядит примерно так:

net.tcp: // локальный хост: ПОРТ / ServiceNamespace / ClassName.

person Ben Tidman    schedule 11.11.2011

Поскольку вы используете IIS, я бы вообще отказался от узла baseAddress, поскольку IIS определит базовый адрес из настроенных вами привязок / виртуального пути.

Также имейте в виду, что WCF не обрадуется атрибуту httpGetEnabled="true" в поведении ваших метаданных без доступных конечных точек http.

person Thomas Butler    schedule 27.02.2012