通过负载平衡器通过IIS的WCF报告错误的基址

通过负载平衡器通过IIS的WCF报告错误的基址,wcf,iis,https,Wcf,Iis,Https,我正在尝试通过负载平衡器在IIS 6上通过SSL启动WCF服务。我最初的问题是一个显而易见且讨论得很好的问题——WSDL页面上显示的地址指向www.mydomain.com,而不是www.mydomain.com。此问题的答案是在IIS中添加主机头值。我这么做了,它成功了。。。某种程度上。现在,当在浏览器中查看wsdl时,我得到了http://www.mydomain.com/WebServices/mydomainws.svc。如果单击该链接(非ssl链接),我会得到一个再次引用服务器名称的服

我正在尝试通过负载平衡器在IIS 6上通过SSL启动WCF服务。我最初的问题是一个显而易见且讨论得很好的问题——WSDL页面上显示的地址指向www.mydomain.com,而不是www.mydomain.com。此问题的答案是在IIS中添加主机头值。我这么做了,它成功了。。。某种程度上。现在,当在浏览器中查看wsdl时,我得到了http://www.mydomain.com/WebServices/mydomainws.svc。如果单击该链接(非ssl链接),我会得到一个再次引用服务器名称的服务定义

下一个经常被推荐的补救方法是使用它,它提供了一个允许您指定基址的扩展。但是设置该配置条目只更新了soap12:address。EndPointReference地址仍在使用计算机名

总结:在http://www.mydomain.com/WebServices/mydomainws.scv上的web浏览器中查看WSDL

单击上面的链接,我将看到一个实际的wsdl文件,其中包含以下服务条目:

我的服务器配置文件包含以下serviceModel条目:

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="TransportSecurity">
                <security mode="Transport">
                    <message clientCredentialType="None"/>
                    <transport clientCredentialType="None"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <services>
        <service name="mydomain.ws.mydomainws" behaviorConfiguration="mydomainwsBehavior">
            <!-- Service Endpoints -->
            <endpoint address="" **behaviorConfiguration="CorrectEndPoint"** binding="wsHttpBinding" bindingConfiguration="TransportSecurity" contract="mydomain.ws.Imydomainws"/>
            <endpoint address="mex" **behaviorConfiguration="CorrectEndPoint"** binding="mexHttpsBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="mydomainwsBehavior">
                <!-- 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="true"/>
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            **<behavior name="CorrectEndPoint">
                <wsdlExtensions location="https://www.mydomain.com/WebServices/mydomainws.svc" singleFile="true"/>
            </behavior>**
        </endpointBehaviors>
    </behaviors>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

    <extensions>
        <behaviorExtensions>
            <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        </behaviorExtensions>
    </extensions>

</system.serviceModel>

**
**
谁能给我指出正确的方向吗?
谢谢
乔治

这应该由新的行为来处理。尝试将此添加到您的服务行为中:

  <serviceBehaviors>
    <behavior name="LoadBalancedBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <useRequestHeadersForMetadataAddress>
        <defaultPorts>
          <add scheme="http" port="80" />
          <add scheme="https" port="443" />
        </defaultPorts>
      </useRequestHeadersForMetadataAddress>

      <!-- Other service behaviors as necesary -->

    </behavior>
  </serviceBehaviors>


这种行为在WCF 4.0中是可用的,在WCF 3.x中应该以KB的形式提供。

我已经阅读了这方面的内容,似乎它应该可以解决我的问题。我正在运行WCF 4.0,但不幸的是添加标签没有任何影响。@GeorgeBarker:你解决过这个问题吗?我也有同样的问题。WSDL总是使用HTTP而不是HTTPS生成地址。我还尝试添加了新的userequestheadersformetadataddress行为,但没有任何区别…@JTech:非常晚的注意,主要是为了我们这样的其他人的利益:如果此修复看起来没有任何作用,那么代理/负载平衡器也可能正在重写请求头。您可以直接在IIS主机上测试服务,绕过代理来确认这一点。对于Apache代理,我必须向配置中添加一个ProxyPreserveHost指令。我能够添加这个指令,然后在WCF测试客户端中,编辑生成的配置以指向https,并进一步编辑它以实现传输安全性。您也可以在任何客户机上有效地执行同样的操作。这适用于我的场景;我不确定这是否适合每个人。我们正在从盒子上的证书转移到BigIp上的证书。值得注意的是:当我从wsHttpBinding切换到basicHttpBinding时,问题就消失了。我必须这样做,因为我的调用者在.NET2.0上,无法使用wsHttpBinding服务。我相信我仍然需要WCF Extras扩展的参考。