gpt4 book ai didi

通过 https 负载平衡器的 WCF http 服务

转载 作者:行者123 更新时间:2023-12-04 15:58:37 26 4
gpt4 key购买 nike

我有一个可以通过 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,我该怎么做?

    最佳答案

    我以前遇到过这个问题,修复几乎是覆盖 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 下,那么它将继续修改绑定(bind)位置,并将生成带有 HTTPS url 的 WSDL。
    在 SoapUI 和 Visual Studio 中测试添加服务引用(app.config 将反射(reflect) https)。
    谢谢

    关于通过 https 负载平衡器的 WCF http 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19789055/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com