SOAP Web服务:许多服务器,一个接口

时间:2008-12-11 20:50:40

标签: c# .net web-services soap wsdl

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

8 个答案:

答案 0 :(得分:2)

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

Service svc = new Service ();
svc.url = "Value read from config. file or some such"
output = svc.method (input);

答案 1 :(得分:2)

如果您使用WebReference(pre-WCF)访问Web服务,则可以在创建Web服务代理类后在其上设置Url属性。

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

  1. 这是用于扩展(每个服务器提供相同的数据)还是
  2. 对于每个服务器上的相同API不同数据?
  3. 对于2,您可以按上述方式执行操作,只需更改代码中的服务URL即可。

    对于1,您可以使用循环DNS(例如,您在命令行类型nslookup www.google.com看到多个服务器)。

答案 6 :(得分:0)

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

答案 7 :(得分: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>

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