Не удается добавить ссылку на службу для службы WCF с помощью netTcpBinding, размещенной в IIS - PullRequest
3 голосов
/ 06 января 2012

У меня есть следующая конфигурация для службы, которую я развернул в IIS. Я могу добавить ссылку на службу для службы, используя URL-адрес для конечной точки wsHttpBinding, но не могу добавить ее, используя URL-адрес для конечной точки mexHttpBinding (и я хочу переключить клиент для использования netTcpBinding)

Я получаю ошибку:

Произошла ошибка при загрузке http://ServerName:98/MyService.svc/mex'.

Запрос не выполнен с состоянием HTTP 400: неверный запрос.

Метаданные содержат ссылку, которая не может быть разрешена: 'http://ServerName:98/MyService.svc/mex'.

Метаданные содержат ссылку, которая не может быть разрешена: 'http://ServerName:98/MyService.svc/mex'.

<system.web>
  <compilation debug="true"
               targetFramework="4.0" />
  <customErrors mode="Off"/>
</system.web>

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="netTcpBinding_MyService" />
    </netTcpBinding>
    <wsHttpBinding>
      <binding name="wsHttpBinding_MyService"
               maxBufferPoolSize="2147483647"
               maxReceivedMessageSize="2147483647" />
    </wsHttpBinding>
  </bindings>
  <services>
    <service behaviorConfiguration="ServiceBehaviour"
             name="MyService.MyService">
      <endpoint address=""
                binding="wsHttpBinding"
                bindingConfiguration="wsHttpBinding_MyService"
                name="MyServiceEndpoint"
                contract="MyService.IMyService" />
      <endpoint address="net.tcp://ServerName:198/MyService.svc"
                binding="netTcpBinding"
                bindingConfiguration="netTcpBinding_MyService"
                name="MyServiceNetTcpEndpoint"
                contract="MyService.IMyService" />
      <endpoint address="http://ServerName:98/MyService.svc/mex"
                binding="mexHttpBinding"
                contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="http://ServerName:98/" />
          <add baseAddress="net.tcp://ServerName:198/" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="ServiceBehaviour">
        <serviceMetadata httpGetEnabled="true"
                         policyVersion="Policy15" />
        <serviceDebug includeExceptionDetailInFaults="true" />
        <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        <serviceCredentials>
          <windowsAuthentication includeWindowsGroups="true"
                                 allowAnonymousLogons="false" />
        </serviceCredentials>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

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

<system.web>
    <compilation debug="true"
                 targetFramework="4.0" />
    <customErrors mode="Off"/>
  </system.web>

  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcpBinding_MyOtherService" />
      </netTcpBinding>
      <wsHttpBinding>
        <binding name="wsHttpBinding_MyOtherService"
                 maxBufferPoolSize="2147483647"
                 maxReceivedMessageSize="2147483647" />
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="ServiceBehaviour"
               name="MyOtherService.MyOtherService">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="wsHttpBinding_MyOtherService"
                  name="MyOtherServiceEndpoint"
                  contract="MyOtherService.IMyOtherService" />
        <endpoint address=""
                  binding="netTcpBinding"
                  bindingConfiguration="netTcpBinding_MyOtherService"
                  name="MyOtherServiceNetTcpEndpoint"
                  contract="MyOtherService.IMyOtherService" />
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  bindingConfiguration=""
                  name="MyOtherServiceMexHttpBindingEndpoint"
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://ServerName:97/" />
            <add baseAddress="net.tcp://ServerName:970/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <serviceMetadata httpGetEnabled="true"
                           policyVersion="Policy15" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <windowsAuthentication includeWindowsGroups="true"
                                   allowAnonymousLogons="false" />
          </serviceCredentials>
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

Как вы заметите, единственные существенные различия в конфигурациях - это адреса для конечной точки netTcpBinding и конечной точки mexHttpBinding. Первоначально я начал с того, что они оба пусты, но, пытаясь заставить его работать, я добавил явные адреса.

Кроме того, обе службы настроены одинаково в IIS, то есть привязки net.tcp включены и настроены на соответствующих портах. Каждый из них также запускает отдельные сайты и отдельные пулы приложений на одном сервере (и оба пула приложений работают под одним и тем же именем).

Буду признателен за любую помощь, спасибо.

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Решил это.У нас есть Web. {Environment} .config для каждой среды, в которой мы развертываем, и правильный конфигурационный файл не копировался через Web.config во время сборки из-за блокировки файла (вероятно, не извлекаемой из TFS) в Web.config....

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

1 голос
/ 09 января 2012

При использовании службы в IIS нельзя настроить абсолютный URL-адрес в конфигурации конечной точки. Корневой URL-адрес контролируется IIS и соответствует общей структуре веб-сайта (указывает порт) / веб-приложения / виртуального каталога / SvcFile. Вы можете указать только относительную часть адреса, указанного после файла .svc.

Установка полного абсолютного адреса и базовых адресов только для самостоятельных сценариев.

Даже если вы добавите ссылку на службу с помощью конечной точки wsHttpBinding, вы все равно сможете переключить ее на конечную точку netTcpBinding, поскольку эта конечная точка должна быть описана в вашем WSDL (если вы удалите эти абсолютные адреса). Обе конечные точки должны быть настроены в файле конфигурации вашего клиента. Тогда вам просто нужно будет передать имя конфигурации конечной точки конструктору служебной заглушки (прокси WCF).

...