通过负载均衡器在IIS上的WCF报告错误的基址

Geo*_*ker 8 iis https wcf

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

下一个建议的补救措施是使用WCF Extras,它提供了一个允许您指定基址的扩展.但是设置该配置条目只更新了soap12:地址.EndPointReference地址仍在使用计算机名称.

总结:WSDL作为在Web浏览器查看https://www.mydomain.com/WebServices/mydomainws.svc: HTTP://www.mydomain.com/WebServices/mydomainws.scv

单击上面的链接可以看到带有以下服务条目的实际wsdl文件:

HTTPS://ServerName/WebServices/mydomainws.svc

我的服务器配置文件包含以下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>
Run Code Online (Sandbox Code Playgroud)

谁能指出我正确的方向?
谢谢,乔治

Lad*_*nka 7

这应该由新行为useRequestHeadersForMetadataAddress进行处理.尝试将此添加到您的服务行为:

  <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>
Run Code Online (Sandbox Code Playgroud)

此行为在WCF 4.0中可用,并且应作为WCF 3.x的KB提供.

  • 我已经阅读了这篇文章,它似乎*应该*解决我的问题.我正在运行WCF 4.0但不幸的是添加标签没有任何影响. (4认同)
  • @GeorgeBarker:你有没有解决这个问题?我有相同的问题.WSDL始终使用HTTP而不是HTTPS生成地址.我也尝试添加新的useRequestHeadersForMetadataAddress行为,它没有任何区别...... (3认同)