WCF http服务通过https负载均衡器

时间:2013-11-05 12:29:34

标签: wcf https wsdl load-balancing

我有一个可以通过http端点访问的WCF Web服务。现在,该服务应通过https与负载均衡器一起发布。客户端是通过svcutil.exe在.Net中创建的,但Java客户端也需要WSDL。

我的理解是:

  • 在内部,webservice是一个http服务,不需要更改任何内容。地址为 http ://myserver.com/example.svc with WSDL ..?wsdl
  • 外部服务必须显示为https服务,地址为 https :// loadbalancer.com/example.svc和WSDL ..?wsdl

从其他帖子我了解到负载均衡器问题可以通过以下行为配置来解决:

    <behavior>
      <!-- To avoid disclosing metadata information, set the value below to false before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <useRequestHeadersForMetadataAddress>
        <defaultPorts>
          <!-- Use your own port numbers -->
          <add scheme="http" port="81" />
          <add scheme="https" port="444" />
        </defaultPorts>
      </useRequestHeadersForMetadataAddress>
    </behavior>

使用此解决方法,我将两个URL解析为服务帮助页面,但调用 https :// loadbalancer.com/example.svc页面将我引导至 http :// loadbalancer.com/example.svc?wsdl。当我用https替换http时,我可以加载wsdl,但它的所有内部链接都是 http ,而不是 https

尝试切换httpsGetEnabled =“true”会导致我遇到很多与https相关的问题,我不知道这是否可以帮助我,因为我的服务器本身只知道http。

所以,我的问题是负载均衡URL的https。我可以告诉WCF它应该在WSDL元数据中显示https而不是http,我该怎么做?

2 个答案:

答案 0 :(得分:0)

不,没办法告诉WCF在WSDL元数据中显示https而不是http。 我们的解决方案是,创建http和https endpointbindings,检查传入请求是否为http或https,传入请求类型确定将使用哪些端点绑定。

答案 1 :(得分:0)

之前我遇到过这个问题,修复程序几乎覆盖了SoapExtensionReflector方法名称:ReflectDescription。

using System.Web.Services.Description;
namespace LoadBalancer
{
    public class HttpsSoapExtensionReflector : SoapExtensionReflector
    {
        public override void ReflectMethod()
        {
            //no-op
        }

    public override void ReflectDescription()
    {
        ServiceDescription description = ReflectionContext.ServiceDescription; 
        foreach (Service service in description.Services)
        {
            foreach (Port port in service.Ports)
            {
                foreach (ServiceDescriptionFormatExtension extension in port.Extensions)
                {
                    SoapAddressBinding binding = extension as SoapAddressBinding;
                    if (null != binding)
                    {
                        binding.Location = binding.Location.Replace("http://", "https://");//Updating the soap address binding location to use https
                    }
                }
            }
        }            

    }
    }
}

将上述类创建到新的或现有的dll项目中(在我的示例中,dll名称为LoadBalancer),您只需从服务器Web配置调用我们的新扩展名,如:

<webServices>
  <soapExtensionReflectorTypes>
    <add type="LoadBalancer.HttpsSoapExtensionReflector, LoadBalancer"/>
  </soapExtensionReflectorTypes>
</webServices>

如果它在LoadBalancer下,那么它将继续并修改绑定位置,它将使用HTTPS url生成WSDL。 在SoapUI上测试并从Visual Studio添加服务引用(app.config将反映https)。 感谢