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

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

Вот копия моего 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 Метаданные содержат ссылку, которая не может быть разрешена: 'net.tcp: // локальный: 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-адрес в тестер, я использую следующий 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 Метаданные содержат ссылку, которая не может быть разрешена: 'net.tcp: // локальный: 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-запроса сервером (возможно, из-за завершения работы службы). См. Журналы сервера для более подробной информации. Базовое соединение было закрыто: при получении произошла непредвиденная ошибка. Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным узлом. Существующее соединение было принудительно закрыто удаленным хостом. URI ошибки HTTP GET: http://localhost:8523/MyWebService Произошла ошибка при загрузке http: // localhost: 8523 / MyWebService. Запрос не выполнен с HTTP-статусом 404: не найден.

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


person Omar Kooheji    schedule 25.04.2012    source источник
comment
Обратите внимание, что второй базовый адрес является результатом того, что я пытался открыть ту же службу, что и веб-служба, я пробовал ее без этого, но она по-прежнему не работает.   -  person Omar Kooheji    schedule 25.04.2012
comment
<add baseAddress="htt://localhost:8523/"/> имеет опечатку в протоколе (HTTP)   -  person SliverNinja - MSFT    schedule 25.04.2012
comment
Это остановит работу службы net.tcp или она будет использоваться для обмена метаданными?   -  person Omar Kooheji    schedule 25.04.2012


Ответы (3)


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

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

<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
person SliverNinja - MSFT    schedule 25.04.2012
comment
Должен ли адрес конечной точки метаданных быть mex или он должен находиться в подкаталоге службы, которую она описывает? - person Omar Kooheji; 25.04.2012
comment
@OmarKooheji Это должно быть mex, по крайней мере, тестовый клиент WCF этого хочет. - person mbx; 27.06.2012

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

person Sebastian Badea    schedule 11.01.2017
comment
Не могли бы вы предоставить дополнительную информацию? Типа справочная документация, пример значений портов ...? - person Joël; 11.01.2017
comment
Это может быть связано с добавлением дополнительной информации; не могли бы вы дополнить свой ответ своим последним комментарием, это было бы более ценно ;-) - person Joël; 17.01.2017

просто попытайтесь сохранить это как есть, и изменив свой сервис внутри и вставив его в свой файл конфигурации, он должен работать безупречно. для тестирования 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>
person Mirko    schedule 04.07.2017
comment
еще две конфигурации на IIS ... ‹br / › - person Mirko; 05.07.2017