我有一个场景,我需要任意数量的服务器来提供相同的 SOAP Web 服务。我想生成一组代理类,并能够为它们提供一个位置,以便在运行时将它们指向不同的服务器。不幸的是,它看起来好像wsdl:port
节点(wsdl:service
) 要求对特定服务器的地址进行硬编码。看来,由于这个原因,URL 将被烘焙到我的代理类中。我知道我可以通过手动编辑生成的代理类或修改代码生成来修改它,但我真的不想诉诸于此。我觉得必须有更好的方法来解决这个问题。我只想将接口定义与服务所在的位置分离。如果有任何帮助,我正在使用 VS2008 和 C#.NET,尽管最好是针对此问题的与语言无关(特定于 SOAP 或 WSDL)的通用解决方案。
8 回答
不,在 .NET 中,您可以在运行时更改 URL。
Service svc = new Service ();
svc.url = "Value read from config. file or some such"
output = svc.method (input);
如果您使用 WebReference(WCF 之前的版本)访问 Web 服务,则可以在创建 Web 服务代理类后简单地设置 Url 属性。
对于 WCF,您可以为代理类构造函数提供不同的端点地址,而不是使用默认值(以及其他可能的解决方案)。
为什么不对 Web 服务器进行负载平衡,然后为负载平衡的 IP 地址创建一个 DNS 条目……本质上是创建一个 Web 场。这将允许您引用主机名而不是静态 IP 地址,如果您需要更改负载均衡器或 Web 服务器的 IP 地址,则只需一次更改。此外,您还可以进行冗余和性能控制。
这是关于如何确定 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>
我希望你能对此有新的想法。
当您向项目添加 Web 引用时,它会将 Web 服务的地址放入您的应用程序/Web 应用程序的 .config 文件中。然后,您可以简单地在配置文件中更改此设置以指向不同的 Web 服务位置,当然假设服务是相同的。
客户端代理具有您可以在运行时设置的 URL 属性。为了使其更简单,wsdl.exe 实用程序具有/appsettingurlkey
密钥。当您生成客户端代理时,它的构造函数将检查 appSettings 中的密钥并相应地设置服务 URL。我相信 WCF 也有这个功能。
但是,我同意@Matt 并建议您从长远来看将负载平衡视为最佳解决方案。
- Is this for scaling (each server provides the same data) or
- 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
).