无法使用IIS中托管的netTcpBinding为WCF服务添加服务引用

时间:2012-01-06 18:56:14

标签: wcf iis nettcpbinding

对于已部署到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 个答案:

答案 0 :(得分:2)

解决了它。我们为每个部署的环境都有一个Web。{Environment} .config,并且由于Web上的文件锁定(可能没有从TFS中检出),因此在构建时没有通过Web.config复制正确的配置。 ...

我应该首先检查其中一件事,但是当它一直在以前工作然后突然破裂而没有警告我从未想过检查。

答案 1 :(得分:1)

在IIS中使用服务时,无法在端点配置中设置绝对URL。根URL由IIS控制,它遵循Web站点(指定端口)/ Web应用程序/虚拟目录/ SvcFile的常见结构。您只能指定.svc文件后指定的地址的相对部分。

设置完整的绝对地址和基址仅适用于自托管方案。

即使使用wsHttpBinding端点添加服务引用,您仍应该能够将其切换到netTcpBinding端点,因为应该在WSDL中描述该端点(如果删除这些绝对地址)。应在客户端的配置文件中配置两个端点。然后,您只需要将端点配置的名称传递给服务存根(WCF代理)的构造函数。