Не удается получить доступ к службе Net TCP из тестового клиента WCF

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

Вот simulcrum моего Web.config (я анонимизировал имя сервиса):

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="ServerService">
        <endpoint address="ServerService" 
                  binding="netTcpBinding" 
                  bindingConfiguration="" 
                  name="NetTcpEndPoint" 
                  contract="IServerService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8523/"/>
            <add baseAddress="htt://localhost:8523/"/>
          </baseAddresses>
        </host>
      </service>

      <service name="MyWebService">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration=""
                  name="AACCWSEndPoint"
                  contract="IMyWebService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8523/IMyWebService"/>
          </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="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

Когда я запускаю это в IDE, он открывает страницу, работающую на порту 51953, и я могу получить WSDL для веб-службы, перейдя по http://localhost:51953/WebService.svc?wsdl (обратите внимание, что порт другой). Я не могу получить WSDL, изменив порт на то, что я указал в файле webconfig (8523).

Когда я указываю приложению WcfTestClient на "net.tcp://localhost:8523/ServerService, и оно выдает мне сообщение об ошибке, говоря, что оно не может получить доступ к метаданным, которые, насколько я вижу, я настроил (второй конечная точка в службе).

Что я здесь не так делаю?

ОБНОВИТЬ:

Я попытался изменить номер порта в свойствах проекта на 8523, как и предполагалось, что это не сработало, я также попытался изменить адрес конечной точки mex на "ServerService\mex", который тестовый клиент потратил некоторое время, но затем он выбросил следующую ошибку:

Ошибка: невозможно получить метаданные из net.tcp: // localhost: 8523 / ServerService. Если это служба Windows (R) Communication Foundation, к которой у вас есть доступ, убедитесь, что вы включили публикацию метаданных по указанному адресу. Справочную информацию о включении публикации метаданных см. В документации MSDN по адресу http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata URI ошибки обмена: net.tcp://localhost:8523/ServerService Metadata содержит ссылка, которая не может быть разрешена: "net.tcp://localhost:8523/ServerService". Вы попытались создать канал для службы, которая не поддерживает.Net Framing. Возможно, вы столкнулись с конечной точкой HTTP. Ожидаемый тип записи "PreambleAck", найдено "72".

Я собираюсь продолжать копать, но я был бы признателен за любую помощь.

ОБНОВЛЕНИЕ 2:

Я изменил конечную точку mex на mexTcpBinding: вот тег службы:

    <endpoint address="ServerServiceWS"
              binding="wsHttpBinding"
              bindingConfiguration=""
              name="WSEndPoint"
              contract="IServerService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex"
              binding="mexTcpBinding"
              contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8523/"/>
        <add baseAddress="http://localhost:8523/"/>
      </baseAddresses>
    </host>
  </service>

Все еще не повезло. Просто чтобы убедиться, что я ввожу правильный URL в тестер, который я использую:

net.tcp://localhost:8523/ServerService

Я также попробовал:

net.tcp://localhost:8523/mex

а также

net.tcp://localhost:8523/

Все это дает мне некоторую вариацию следующей ошибки:

Ошибка: невозможно получить метаданные из net.tcp: // localhost: 8523 / ServerService. Если это служба Windows (R) Communication Foundation, к которой у вас есть доступ, убедитесь, что вы включили публикацию метаданных по указанному адресу. Справочную информацию о включении публикации метаданных см. В документации MSDN по адресу http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata URI ошибки обмена: net.tcp://localhost:8523/ServerService Metadata содержит ссылка, которая не может быть разрешена: "net.tcp://localhost:8523/ServerService". Вы попытались создать канал для службы, которая не поддерживает.Net Framing. Возможно, вы столкнулись с конечной точкой HTTP. Ожидаемый тип записи "PreambleAck", найдено "72".

ОБНОВЛЕНИЕ 3

FWIW Я думаю, что может быть большая проблема с моим WEb.config Вот как это выглядит в настоящее время:

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="ServerService">
        <endpoint address="" 
                  binding="netTcpBinding" 
                  bindingConfiguration="DefaultBindingConfig" 
                  name="NetTcpEndPoint" 
                  contract="IServerService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>

        <endpoint address="mex"
                  binding="mexTcpBinding"
                  contract="IMetadataExchange" 
                  bindingConfiguration="mexBinding"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8523/"/>
          </baseAddresses>
        </host>
      </service>

      <service name="MyWebService">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration=""
                  name="MyWSEndPoint"
                  contract="IMyWebService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange"
                  bindingConfiguration="mexHttpBinding"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8523/MyWebService"/>
          </baseAddresses>
        </host>
      </service>

    </services>
    <bindings>
      <netTcpBinding>
        <binding name="DefaultBindingConfig"
                 maxConnections="5"
                 portSharingEnabled="true" >
        </binding>
        <binding name="mexBinding"
                 portSharingEnabled="true">
          <security mode="None"></security>
        </binding>
      </netTcpBinding>
      <mexTcpBinding>
        <binding name="mexTcpBinding"/>
      </mexTcpBinding>
      <mexHttpBinding>
        <binding name="mexHttpBinding"/>
      </mexHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServerServiceBehaviour">
          <!-- 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="false"/>
        </behavior>
        <behavior name="MexBehaviour">
          <serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

Я могу перейти к веб-сервису, и это позволяет мне получить WSDL, используя? Wsdl, но если я добавлю адрес http://localhost:8523/MyWebService в тестер WCF, то тоже выдаст ошибку.

Ошибка: невозможно получить метаданные из http://localhost:8523/MyWebService Если это служба Windows (R) Communication Foundation, к которой у вас есть доступ, убедитесь, что вы включили публикацию метаданных по указанному адресу. Для получения справки о включении публикации метаданных обратитесь к документации MSDN по адресу http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata URI ошибки обмена: http://localhost:8523/MyWebService Метаданные содержат ссылку это не может быть решено: 'http://localhost:8523/MyWebService'. Произошла ошибка при получении HTTP-ответа на http://localhost:8523/MyWebService. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы). Смотрите журналы сервера для более подробной информации. Основное соединение было закрыто: при получении произошла непредвиденная ошибка. Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. Существующее соединение было принудительно закрыто удаленным hostHTTP GET Error URI: http://localhost:8523/MyWebService Произошла ошибка при загрузке "http: // localhost: 8523 / MyWebService". Запрос не выполнен с состоянием HTTP 404: не найдено.

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

3 ответа

Для конечной точки HTTP необходимо перенастроить свойства проекта, чтобы она запускала определенную конечную точку web.config на порту 8523, если она размещена с использованием IIS Express. Используйте определенный порт (8523) вместо автоматически назначенного порта (51953).

Для метаданных TCP вам необходимо поддерживать конечную точку mex с поддержкой TCP (mexTcpBinding).

<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />

Привязки net.tcp и HTTP должны быть установлены на разных портах IIS. Это может быть проверено с тем же портом или другим. Это потерпит крах в первом случае. Кроме того, вы можете использовать любые номера портов, которые вы хотите. В этом случае порт TCP можно изменить на 8524. Просто вы не можете использовать два отдельных протокола на одном и том же порту. С другой стороны, базовые адреса имеют смысл только для автономных служб. Здесь базовый адрес определяется по URL из IIS.

Просто постарайтесь сохранить все как есть, и измените ваш сервис внутри и вставьте его в ваш конфигурационный файл, он должен работать отлично. для тестирования net.tcp вы можете использовать SvcUtil.exe

       <system.serviceModel>
<services>
  <service name="MyWCFServices.HelloWorldService">
    <endpoint
         binding="netTcpBinding"
         bindingConfiguration="ultra"
         contract="MyWCFServices.IHelloWorldService"/>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"  />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8086/HelloWorldService.svc" />
        <add baseAddress="http://localhost:8081/HelloWorldService.svc" />
      </baseAddresses>
    </host>
  </service>
</services>
<bindings>
  <netTcpBinding>
    <binding name="ultra"
         maxBufferPoolSize="2147483647"
         maxBufferSize="2147483647"
         maxReceivedMessageSize="2147483647"
         portSharingEnabled="false"
         transactionFlow="false"
         listenBacklog="2147483647" >
      <security mode="None">
        <message clientCredentialType="None"/>
        <transport protectionLevel="None" clientCredentialType="None"/>
      </security>
      <reliableSession enabled="false"/>
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
Другие вопросы по тегам