我有一个场景,我将需要任意数量的服务器来提供相同的SOAP Web服务。我想生成一组代理类,并能够为它们提供一个位置,以便在运行时将它们指向不同的服务器。不幸的是,看起来wsdl:port
节点(wsdl:service
的子节点)需要对特定服务器的地址进行硬编码。看来,由于这个原因,URL将被烘焙到我的代理类中。我知道我可以通过手工编辑生成的代理类或修改代码生成来修改它,但我真的不想诉诸于此。我觉得必须有一个更好的方法来解决这个问题。我只想将接口定义与服务所在的位置分离。我正在使用VS2008和C#.NET,如果有任何帮助,尽管最好是与语言无关(特定于SOAP或WSDL)的一般解决方案。
答案 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)
对于2,您可以按上述方式执行操作,只需更改代码中的服务URL即可。
对于1,您可以使用循环DNS(例如,您在命令行类型nslookup www.google.com
看到多个服务器)。
答案 6 :(得分:0)
答案 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>
我希望你能对此有新的想法。