WCF - исключение EndPoint Not Found

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

У меня есть две службы wcf (на самом деле 4, но об этом позже). Одним из них является веб-сервис SOAP, работающий на IIS. Веб-сервис пытается позвонить другому сервису (агенту). В производственной среде между двумя службами есть два межсетевых экрана. Они используют протокол net.tcp с сертификатом безопасности для подключения.

Мы используем самозаверяющие сертификаты для разработки и обеспечения качества.

У меня установлены сертификаты клиента и службы, и я предоставил доступ к сертификатам в пуле приложений.

Я убедился, что служба общего доступа к портам Net.Tcp, адаптер прослушивателя Net.Tcp, адаптер прослушивателя Net.Pipe все работают.

Протокол net.tcp включен, и привязка net.tcp определена в IIS.

Брандмауэр выключен.

Обе службы подключаются к службе Identity Management (IMS), которая также является службой WCF, работающей на сервере qa, а не на моей локальной машине. Веб-сервис может успешно подключиться к сервису IMS. Я пытаюсь использовать ту же привязку для подключения к агенту службы. Насколько я могу судить, адрес, привязка и контракт все совпадают между веб-сервисом и агентом, но я все еще получаю исключение EndPointNotFoundException. Что я пропустил?

Вот раздел system.serviceModel из web.config для веб-службы:

  <system.serviceModel>
<client>
  <endpoint address="net.tcp://localhost:8102/Acord/201307" behaviorConfiguration="NetTcpCertificatesBehavior" binding="netTcpBinding" bindingConfiguration="NetTcpCertificatesBinding" contract="AcordContract.IAcordService201307" name="AcordCertificateEndpoint">
    <identity>
      <certificateReference findValue="(value redacted)" isChainIncluded="false" storeLocation="LocalMachine" x509FindType="FindByThumbprint" />
      <dns value="localhost" />
    </identity>
  </endpoint>
</client>
<behaviors>
  <endpointBehaviors>
    <behavior name="NetTcpCertificatesBehavior">
      <clientCredentials>
        <clientCertificate findValue="(value redacted)" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
        <serviceCertificate>
          <authentication certificateValidationMode="None" />
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>
<bindings>
  <netTcpBinding>
    <binding name="NetTcpCertificatesBinding" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
      <security>
        <transport clientCredentialType="Certificate" protectionLevel="EncryptAndSign" />
      </security>
    </binding>
    <binding name="NetTcpMessageCertificatesBinding" 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="100"
             maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="100" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
      <security mode="Message">
        <message clientCredentialType="Certificate" />
      </security>
    </binding>
    <binding name="NetTcpWindowsBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:10:00"
             transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard"
             listenBacklog="10" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="32" maxStringContentLength="65535" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
      <security mode="Transport">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
        <message clientCredentialType="Windows"/>
      </security>
    </binding>
    <binding name="NetTcpMessageWindowsBinding" 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="100" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="100" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"  />
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
      <security mode="Message">
        <message clientCredentialType="Windows" />
      </security>
    </binding>
  </netTcpBinding>
</bindings>

Вот раздел system.serviceModel из app.config для службы агента:

<system.serviceModel>
<diagnostics performanceCounters="Default"/>
<bindings>
  <netTcpBinding>
    <binding name="NetTcpWindowsBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:10:00" 
             transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" 
             listenBacklog="10" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="32" maxStringContentLength="65535" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
      <security mode="Transport">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
        <message clientCredentialType="Windows"/>
      </security>
    </binding>
    <binding name="NetTcpCertificatesBinding" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" sendTimeout="00:10:00" portSharingEnabled="true">
      <security>
        <transport clientCredentialType="Certificate" protectionLevel="EncryptAndSign"/>
      </security>
    </binding>
    <binding name="NetTcpMessageWindowsBinding" 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="100" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="100" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"  />
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
      <security mode="Message">
        <message clientCredentialType="Windows" />
      </security>
    </binding>      
  </netTcpBinding>
</bindings>
<services>
  <service name="AcordAgent.AcordService" behaviorConfiguration="AcordServiceBehavior">

    <endpoint address="http://qaschedapp:8100/Acord" binding="webHttpBinding" behaviorConfiguration="HttpWebGetBehavior" contract="AcordContract.IMeta" name="MetaEndpoint">
      <!--the name of this endpoint above (MetaEndpoint) must stay-->
    </endpoint>
    <!--binding for clients within the firewall calling from C# with WCF -->
    <endpoint address="net.tcp://localhost:8101/Acord/201307" binding="netTcpBinding" bindingConfiguration="NetTcpMessageWindowsBinding" name="NetTcpWindowsEndpoint" contract="AcordContract.IAcordService201307">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <!--binding for clients outside the firewall calling from C# with WCF using certs -->
    <endpoint address="net.tcp://localhost:8102/Acord/201307" binding="netTcpBinding" bindingConfiguration="NetTcpCertificatesBinding" name="NetTcpCertificatesEndpoint" contract="AcordContract.IAcordService201307">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="net.tcp://localhost:8102/Acord/mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="NetTcpCertificatesBehavior">
      <clientCredentials>
        <clientCertificate findValue="(value redacted)" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint"/>
        <serviceCertificate>
          <authentication certificateValidationMode="None"/>
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="AcordServiceBehavior">
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <serviceCredentials>
        <serviceCertificate findValue="(value redacted)" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint"/>
        <clientCertificate>
          <certificate findValue="(value redacted)" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint"/>
        </clientCertificate>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

Приложение: Я только что запустил netstat -a и не вижу ничего, слушающего порт 8102. Так ясно, что именно поэтому я получаю ответ, который я получаю. Вопрос, который у меня сейчас возникает, почему агент не слушает 8102? У меня запущена служба агента в Visual Studio 2015 с установленными точками останова. Нужно ли устанавливать сервис, а затем подключаться к процессу?

1 ответ

Что ж, проблема заключалась в том, что в файле конфигурации этого приложения есть appSetting, который контролирует, создается ли сервисный хост или нет, а для параметра установлено значение false. Я не могу сказать, почему есть такая настройка в файле конфигурации. Однако, установив для appSetting значение true, просто выявила совершенно новую проблему. Итак, к следующей проблеме.

Другие вопросы по тегам