Размещение службы WCF в IIS 7 с привязками net.tcp — ошибка при использовании службы

Я пытаюсь разместить службу WCF с привязками Net TCP в IIS 7/Win 7. Служба размещена, и я могу добавить ссылку на нее в своем клиентском приложении.

Вот файл конфигурации службы:

  <configuration>

    <system.web>
      <compilation debug="true" targetFramework="4.0" />

    </system.web>
    <system.serviceModel>
      <bindings>
        <netTcpBinding>
          <binding name="InsecureTcp" portSharingEnabled ="true">
            <security mode="None">
              <transport clientCredentialType="None" protectionLevel="None" />
            </security>
          </binding>
        </netTcpBinding>
      </bindings>
      <services>
        <service name="ApplicationProcessService">
          <endpoint address="" binding="netTcpBinding" bindingConfiguration="InsecureTcp"
            name="NetTCP_Port10000" contract="IApplicationProcess" />
          <endpoint address="mex" binding="mexHttpBinding" name="mexNetTCP_Port10000"
            contract="IMetadataExchange" />
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <behavior name="">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
        <baseAddressPrefixFilters>
        </baseAddressPrefixFilters>
      </serviceHostingEnvironment>

    </system.serviceModel>
    <system.webServer>
      <modules runAllManagedModulesForAllRequests="true"/>
    </system.webServer>

  </configuration>

А вот конфигурация, сгенерированная на клиенте, когда я добавляю ссылку:

<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NetTCP_Port10000" closeTimeout="00:01:00" openTimeout="00:01:00"
            receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
            transferMode="Buffered" transactionProtocol="OleTransactions"
            hostNameComparisonMode="StrongWildcard" listenBacklog="10"
            maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
            maxReceivedMessageSize="65536">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
              enabled="false" />
          <security mode="None">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <client>
      <endpoint address="net.tcp://localhost:10000/ApplicationProcess.svc"
          binding="netTcpBinding" bindingConfiguration="NetTCP_Port10000"
          contract="ApplicationProcessService.IApplicationProcess" name="NetTCP_Port10000" />
    </client>
  </system.serviceModel>
</configuration>

Проблема во время выполнения, я получаю следующую ошибку: -

Не удалось подключиться к net.tcp://localhost:10000/AppServer.ApplicationProcess.svc. Попытка подключения продолжалась в течение промежутка времени 00:00:02.0582058. Код ошибки TCP 10061: не удалось установить соединение, поскольку целевая машина активно отказалась от него.

Я выполнил шаги, описанные в http://www.singingeels.com/Articles/Duplex_WCF_Services_Hosted_in_IIS_Using_NetTcp.aspx< /а>

и создал правило для входящего трафика в моем брандмауэре, разрешающее TCP-связь через порт 10000. Я не уверен, что мне не хватает. Есть предположения?


person Apurv    schedule 10.08.2011    source источник
comment
нашел подобный вопрос, но я не делаю эту ошибку. [stackoverflow.com/questions/ 4820172/how-to-setup-wcf-net-tcp]   -  person Apurv    schedule 11.08.2011
comment
Вы когда-нибудь догадывались об этом? stackoverflow .com/questions/16628382/   -  person Niels Brinch    schedule 25.05.2013


Ответы (3)


Ключевым моментом здесь является то, что вы включили совместное использование портов (PortSharingEnabled в ваших привязках), что требует запуска службы совместного использования портов TCP, которая по умолчанию не работает в Windows. См. эту ссылку: NetTcpBinding.PortSharingEnabled

person Haukman    schedule 10.08.2011
comment
я добавил PortSharingEnabled, так как думал, что это может быть проблемой, но ничего не изменил. У меня запущена служба NetTcpPortSharing под services.msc. - person Apurv; 11.08.2011
comment
в порядке. сделайте netstat -ban, чтобы увидеть, открыт ли 10000, возможно, он привязан к вашему локальному ip (и не ко всем). Попробуйте подключиться к имени/IP вашей машины вместо localhost. - person Haukman; 11.08.2011
comment
Это выглядит правильно. Я предполагаю, что у вас установлен какой-то сторонний брандмауэр. - person Haukman; 12.08.2011
comment
Корпоративный антивирус McAfee. Не вижу настройки брандмауэра в McAfee. - person Apurv; 12.08.2011
comment
McAfee может быть виновником. Можете ли вы попробовать подключиться по телнету к локальному хосту 10000 и посмотреть, получите ли вы приглашение или он сразу же закроется? - person Haukman; 15.08.2011
comment
Я запустил cmd (run as admin), а затем набрал telnet myIPAddress 10000. Окно на некоторое время становится пустым, а затем я вижу C:\Windows\System32. Я могу предположить, что Telnet не работает. Вы можете порекомендовать обходной путь? Я не могу отключить McAfee, так как для этого, вероятно, требуются права администратора домена. - person Apurv; 16.08.2011
comment
Если вы получите приглашение обратно (вместо мигающего курсора в верхней части экрана), значит, вас что-то блокирует. Можете ли вы попробовать это на другой машине? Корпоративным ИТ-специалистам нравится блокировать эти вещи, поскольку некоторые вирусы и рекламное ПО любят устанавливать локальный прокси-сервер для получения всего вашего интернет-трафика. Блокируя локальные порты, они неэффективны. Но это трудно подтвердить, попробуйте сначала на другой машине, если она доступна. - person Haukman; 16.08.2011
comment
возможно, чтобы заставить это работать на моей машине разработки, я попытаюсь использовать другой порт. Я также подтвержу с ИТ, если этот порт заблокирован. ... Но тогда это меня немного смущает... я могу настроить службу с привязкой basicHttp к порту 10000, и она работает. Я также попытался разместить обычную службу Windows, размещенную на сервере net tcp, на 10000, и она тоже работает. Так или иначе, я не могу заставить себя поверить, что McAfee может быть причиной. Я просто не могу запустить службу TCP в IIS. - person Apurv; 16.08.2011
comment
Ах, тогда я сомневаюсь, что это брандмауэр, хорошая информация, но все равно очень странно, что телнет не работает. С другой стороны, это может быть WCF, который принимает соединение, но что-то не так, поэтому он сразу же принудительно закрывает его. Может быть, вы можете включить полную трассировку WCF и посмотреть, сможете ли вы что-то увидеть? - person Haukman; 16.08.2011
comment
я откладываю это на некоторое время. Я буду работать над этим через неделю после следующей. надо заняться другими делами... - person Apurv; 21.08.2011
comment
Спасибо за вашу помощь. Я отмечаю ваш ответ как правильный ответ за вашу помощь. Я развернул свой код как есть на Windows Server 2008, и он работал как часы. Однако на моей Win 7 это все еще проблема. Сейчас мы используем привязки http для наших машин Win 7, и код развертывается на Windows Server 2008 с привязками net.tcp. - person Apurv; 02.10.2011
comment
хорошо, спасибо, извините, я не смог получить конечный результат, который вы ожидали. - person Haukman; 04.10.2011

В дополнение к службе совместного использования портов Net.Tcp, о которой упоминалось ранее, вам также необходимо включить и запустить службу адаптера прослушивателя Net.Tcp.

person chris.house.00    schedule 11.08.2011
comment
проверено. это также включено. служба адаптера прослушивателя Net.Tcp настроена на автоматический запуск, и служба NetTcpPortSharing также настроена на автоматический запуск. - person Apurv; 11.08.2011
comment
Обратите внимание, что auo start просто означает, что он запустится при запуске eindows. Если винда уже запущена не влияет, то нужно запустить службу вручную (или перезагрузить) - person Niels Brinch; 25.05.2013

В дополнение к службам, которые необходимо было включить, мне также нужно было включить IIS для распознавания net.tcp. Щелкните правой кнопкой мыши свой веб-сайт > Управление приложением > Дополнительные параметры. Значение для включенных протоколов должно быть следующим: http,net.tcp.

person Tresto    schedule 15.11.2013