【问题标题】:WCF over IIS through load balancer reports wrong base addressWCF over IIS 通过负载均衡器报告错误的基地址
【发布时间】:2011-04-29 09:50:09
【问题描述】:

我正在尝试通过负载平衡器在 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 地址仍在使用机器名称。

总结一下:在https://www.mydomain.com/WebServices/mydomainws.svc 的网络浏览器中查看的 WSDL: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>

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

【问题讨论】:

  • 值得注意的是:当我从 wsHttpBinding 切换到 basicHttpBinding 时,问题就消失了。无论如何,我必须这样做,因为我的调用者在 .net 2.0 上并且不能使用 wsHttpBinding 服务。我相信我仍然需要参考 WCF Extras 扩展。

标签: wcf iis https


【解决方案1】:

这应该由新行为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>

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

【讨论】:

  • 我已阅读此内容,看来它应该解决我的问题。我正在运行 WCF 4.0,但不幸的是添加标签没有影响。
  • @GeorgeBarker:你有没有解决这个问题?我有同样的问题。 WSDL 始终使用 HTTP 而不是 HTTPS 生成地址。我也尝试添加新的 useRequestHeadersForMetadataAddress 行为,它没有任何区别......
  • @JTech:很晚的说明,主要是为了像我们这样的其他人的利益:如果这个修复似乎没有做任何事情,代理/负载平衡器也可能正在重写请求标头。您可以直接在 IIS 主机上测试服务,绕过代理来确认这一点。对于 Apache 代理,我必须在配置中添加一个 ProxyPreserveHost 指令。
  • 我能够添加它,然后在 WCF 测试客户端中,编辑生成的配置以指向 https,并进一步对其进行编辑以进行传输安全。您也可以在任何客户端中有效地执行相同的操作。这适用于我的场景;我不确定它是否适用于每个人。我们正在从盒子上的证书转移到 BigIp 上的证书。
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 2011-10-11
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2021-12-07
相关资源
最近更新 更多