2

我有一个场景,我需要任意数量的服务器来提供相同的 SOAP Web 服务。我想生成一组代理类,并能够为它们提供一个位置,以便在运行时将它们指向不同的服务器。不幸的是,它看起来好像wsdl:port节点(wsdl:service) 要求对特定服务器的地址进行硬编码。看来,由于这个原因,URL 将被烘焙到我的代理类中。我知道我可以通过手动编辑生成的代理类或修改代码生成来修改它,但我真的不想诉诸于此。我觉得必须有更好的方法来解决这个问题。我只想将接口定义与服务所在的位置分离。如果有任何帮助,我正在使用 VS2008 和 C#.NET,尽管最好是针对此问题的与语言无关(特定于 SOAP 或 WSDL)的通用解决方案。

4

8 回答 8

2

不,在 .NET 中,您可以在运行时更改 URL。

Service svc = new Service ();
svc.url = "Value read from config. file or some such"
output = svc.method (input);
于 2008-12-11T21:17:10.017 回答
2

如果您使用 WebReference(WCF 之前的版本)访问 Web 服务,则可以在创建 Web 服务代理类后简单地设置 Url 属性。

对于 WCF,您可以为代理类构造函数提供不同的端点地址,而不是使用默认值(以及其他可能的解决方案)。

于 2008-12-11T21:19:34.503 回答
2

为什么不对 Web 服务器进行负载平衡,然后为负载平衡的 IP 地址创建一个 DNS 条目……本质上是创建一个 Web 场。这将允许您引用主机名而不是静态 IP 地址,如果您需要更改负载均衡器或 Web 服务器的 IP 地址,则只需一次更改。此外,您还可以进行冗余和性能控制。

于 2008-12-11T21:46:36.117 回答
0

这是关于如何确定 WSDL 的 URL 的提示。我只是在更改端口,但当然可以使其更先进。

public class PortChangeReflector : SoapExtensionReflector
{     
    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 (binding != null && !binding.Location.Contains("8092"))
                    {
                        binding.Location = binding.Location.Replace("92", "8092");
                    }
                }
            }
        }
    }
}

将其放入您的Add_Code并将以下引用添加到您的web.config

<webServices>
     <soapExtensionReflectorTypes>
          <add type="Dev.PortChangeReflector,App_Code"/>
     </soapExtensionReflectorTypes>
</webServices>

我希望你能对此有新的想法。

于 2009-03-17T12:41:25.757 回答
0

最简单的解决方案是使用软件负载平衡器,例如HAProxy。以更高的成本,您可以使用Big-IP等硬件解决方案。

于 2009-01-13T20:44:31.073 回答
0

当您向项目添加 Web 引用时,它会将 Web 服务的地址放入您的应用程序/Web 应用程序的 .config 文件中。然后,您可以简单地在配置文件中更改此设置以指向不同的 Web 服务位置,当然假设服务是相同的。

于 2008-12-11T20:57:47.573 回答
0

客户端代理具有您可以在运行时设置的 URL 属性。为了使其更简单,wsdl.exe 实用程序具有/appsettingurlkey密钥。当您生成客户端代理时,它的构造函数将检查 appSettings 中的密钥并相应地设置服务 URL。我相信 WCF 也有这个功能。

但是,我同意@Matt 并建议您从长远来看将负载平衡视为最佳解决方案。

于 2008-12-11T22:00:29.850 回答
0
  1. Is this for scaling (each server provides the same data) or
  2. for same API different data on each server?

For 2, then you can do as above, just change the service URL in code.

For 1, you could use round-robin DNS (e.g. you see multiple servers with at the command line type nslookup www.google.com).

于 2008-12-12T06:54:00.960 回答