Базовый адрес службы WCF Http и netTcp - PullRequest
10 голосов
/ 06 января 2010

У меня есть два базовых адреса, определенных в моем конфигурационном файле службы WCF:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>      
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning, ActivityTracing"
        propagateActivity="true">
        <listeners>
          <add type="System.Diagnostics.DefaultTraceListener" name="Default">
            <filter type="" />
          </add>
          <add name="ServiceModelTraceListener">
            <filter type="" />
          </add>
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="C:\WCF Service Logs\app_tracelog.svclog"
        type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
        name="ServiceModelTraceListener" traceOutputOptions="DateTime, Timestamp">
        <filter type="" />
      </add>
    </sharedListeners>
  </system.diagnostics>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcp" maxBufferPoolSize="50000000" maxReceivedMessageSize="50000000">
          <readerQuotas maxDepth="500" maxStringContentLength="50000000" maxArrayLength="50000000" maxBytesPerRead="50000000" maxNameTableCharCount="50000000" />
          <security mode="None"></security>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
        name="ReportingComponentLibrary.TemplateReportService">
        <endpoint address="TemplateService" binding="netTcpBinding" bindingConfiguration="netTcp"
          contract="ReportingComponentLibrary.ITemplateService"></endpoint>
        <endpoint address="ReportService" binding="netTcpBinding" bindingConfiguration="netTcp"
          contract="ReportingComponentLibrary.IReportService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8001/TemplateReportService" />
            <add baseAddress="http://localhost:8181/TemplateReportService"  />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ReportingComponentLibrary.TemplateServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

И хотя я установил привязку конечной точки как netTcpBinding,
Я могу получить доступ к своей службе WCF только с базовым адресом:

http://localhost:8181/TemplateReportService

а не с

net.tcp://localhost:8001/TemplateReportService

Как я могу сделать доступ к моей услуге с помощью адреса netTcp?

Ответы [ 2 ]

16 голосов
/ 06 января 2010

Вы определили базовый адрес Net.TCP:

net.tcp://localhost:8001/TemplateReportService

Ваши конечные точки с Net TCP:

<endpoint address="TemplateService" 

и

<endpoint address="ReportService" 

Таким образом, их полный адрес службы будет «базовый адрес netTcp» + «относительный адрес, как определено для элемента <endpoint>» - это дает:

net.tcp://localhost:8001/TemplateReportService/TemplateService

и

net.tcp://localhost:8001/TemplateReportService/ReportService

почтительно.

Можете ли вы использовать их по этим адресам ??

Кроме того - вы определили конечную точку «mex» (обмен метаданными) для протокола HTTP - вот почему вы можете видеть что-то, когда переходите к адресу HTTP. Но вы не указали конечную точку MEX для netTcp.

1 голос
/ 24 июля 2014

Из-за отсутствия четких ответов я решил сам найти лучшее решение. Вот что нужно сделать, чтобы настроить конечную точку службы WCF NET TCP в IIS 7.0.

Для этого нам понадобится два шага:

  1. Настройка файла конфигурации для конечной точки WCF net tcp
  2. Настройка IIS для net tcp

1. Сконфигурировать файл конфигурации для конечной точки WCF net tcp

Ниже приведен типичный файл конфигурации, обратите внимание, что значение "address" в конечной точке службы пусто.

Также обратите внимание, что внутри узла "хост" я добавляю 2 базовых адреса, протокол http и net tcp соответственно. Поскольку служба размещена в IIS, вам не нужно беспокоиться об абсолютном адресе в конечной точке, IIS вычисляет это на основе базового адреса, который мы определили внутри узла "host".

    <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behaviorConfig">
          <!--your custom behavior here-->
        </behavior>
      </serviceBehaviors>
    </behaviors>
     <bindings>
      <basicHttpBinding>
        <binding name="basicHttpBindingConfig"/>
      </basicHttpBinding>
      <netTcpBinding>
        <!--our netTcpBinding binding-->
        <binding name="netTcpBindingConfig"/>   
      </netTcpBinding>
    </bindings>
    <services>
      <service name="MyNamespace.ServiceLayer.MyService" behaviorConfiguration="behaviorConfig">
        <!--Endpoint for basicHttpBinding-->
        <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.ServiceLayer.IMyService" bindingConfiguration="basicHttpBindingConfig"/>
        <!--Endpoint for netTcpBindingConfig-->
        <endpoint address="" binding="netTcpBinding" contract="MyNamespace.ServiceLayer.IMyService" bindingConfiguration="netTcpBindingConfig">
        <identity>
            <dns value="localhost" />
        </identity>
    </endpoint>
    <!--Make sure you add a mexTcpBinding, without it you will receive an error when trying to resolve service's reference-->
    <endpoint address="mex" 
              binding="mexTcpBinding" 
              bindingConfiguration=""
              name="MyServiceMexTcpBidingEndpoint" 
              contract="IMetadataExchange" />
        <host>
            <!--This part is important for IIS to determine the base addresses for your endpoints-->
            <baseAddresses>            
                 <!--Notice that baseAddress for net tcp is preceded by net.tcp -->
                 <!--then ://localhost:{port} -->
                 <!--Also the same for http, so you can figure out how to define a baseAddress for https-->
               <add baseAddress="net.tcp://localhost:8090"/>
               <add baseAddress="http://localhost:8080"/>
            </baseAddresses>
        </host>
      </service>
    </services>    
  </system.serviceModel>

2. Настройте IIS для net tcp

В IIS (после обновления службы до новой конфигурации) включите протокол net.tcp. Это шаги:

  • Открыть IIS.
  • В списке сайтов найдите свой "сайт", на котором размещен ваш wcf, затем щелкните по нему правой кнопкой мыши
  • затем выберите «Редактировать привязки»,
  • появится список привязок (убедитесь, что там нет net.tcp), затем добавьте свою конфигурацию net.tcp,
  • нажмите «Добавить»,
  • Введите net.tcp (или выберите net.tcp из выпадающего списка, если он доступен)
  • в привязке Тип информации: 8090: * (убедитесь, что это тот же порт, что и в хосте> базовый адрес, который вы добавили)
  • затем закройте это окно и перезапустите службу.

После этого есть еще одна конфигурация:

  • Открыть IIS
  • В списке сайтов найдите свой "сайт", на котором размещен ваш wcf, затем щелкните по нему правой кнопкой мыши
  • Нажмите «Расширенные настройки»
  • Выбрать включенные протоколы
  • Установите значение http, net.tcp (убедитесь, что между http, net.tcp нет пробелов)
  • Перезапустите сервис

Кроме того, если вы все еще не можете получить доступ к сервису, вам может потребоваться запустить адаптер прослушивателя Net.tcp на вашем сервере. Для этого выполните следующие действия:

  • Перейдите в ServerManager -> Конфигурация -> Службы, остановите адаптер прослушивателя Net.Tcp и Службу совместного использования портов Net.Tcp. Затем запустите их снова.

Это все, что вам нужно сделать, чтобы конечная точка WCF nettcp была включена в IIS.

Надеюсь, это поможет.

Привет

...