База данных службы WCF Адрес Http и netTcp

У меня есть два базовых адреса, определенных в моем конфигурационном файле службы 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?

Ответ 1

Вы определили базовый адрес 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.

Ответ 2

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

Для этого нам нужно выполнить два шага:

  • Настроить конфигурационный файл для конечной точки net tcp WCF
  • Настройка IIS для net tcp

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

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

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

    <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 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 из раскрывающегося списка, если он доступен)
  • in binding Тип информации: 8090: * (убедитесь, что он тот же порт, что и в базовом адресе хостa > , который вы добавили)
  • затем закройте это окно и перезапустите службу.

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

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

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

  • Перейдите в ServerManager → Configuration → Services, остановите адаптер прослушивателя Net.Tcp и службу обмена портами Net.Tcp. Затем запустите их снова.

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

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

Привет