6

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

我的理解是:

  • 在内部,Web 服务是一个 http 服务,无需更改任何内容。地址是http://myserver.com/example.svc和 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,我该怎么做?

4

2 回答 2

1

我以前遇到过这个问题,修复几乎是覆盖 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)。谢谢

于 2016-12-20T21:53:39.937 回答
-1

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

于 2014-10-16T09:21:36.450 回答