如何在.NET中dynamic切换Web服务地址而无需重新编译?

我有引用Web服务的代码,并且我希望该Web服务的地址是dynamic的(从数据库,configuration文件等中读取),以便轻松更改。 其中一个主要用途是部署到机器名称和IP地址不同的多个环境。 所有部署中的Web服务签名都是相同的,只是位于其他地方。

也许我刚刚被Visual Studio“添加Web引用”向导所迷惑 – 看起来这应该是相对容易的事情。

生成Web引用并在“解决scheme资源pipe理器”中单击Web引用时。 在属性窗格中,您应该看到如下所示的内容:

Web引用属性

将值更改为dynamic将在您的app.config中input一个条目。

这是有更多信息的CodePlex文章 。

如果你真的dynamic设置这个,你应该设置你正在调用的代理类实例的.Url字段。

在程序中设置.config文件中的值:

  1. 是一个烂摊子;

  2. 在下一个应用程序启动之前可能不会被读取。

如果只是每次安装需要完成一次,我会同意其他海报,并使用.config文件和dynamic设置。

将url行为更改为“ dynamic ”。

只要Web服务方法和底层暴露的类不会改变,这是相当简单的。 使用Visual Studio 2005(及更新版本),添加一个Web引用会创build一个具有此URL的app.config(或web.config,适用于Web应用程序)部分。 您只需编辑app.config文件以反映所需的URL。

在我们的项目中,我们简单的方法就是根据环境types(开发,testing,生产)对app.config条目进行评论。 所以我们只取消注释所需环境types的条目。 那里不需要特殊的编码。

我已经为这个问题奋斗了几天,最后点击了灯泡。 能够在运行时更改Web服务的URL的KEY正在覆盖构造函数,我使用了部分类声明。 上面,将URL行为设置为dynamic也必须完成。

这基本上创build了一个web服务包装,如果你必须在某个时候重新加载web服务,通​​过添加服务引用,你不会放松你的工作。 Microsoft为部分类提供的帮助特别指出,此构造的部分原因是创buildWeb服务包装。 http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.100).aspx

 // Web Service Wrapper to override constructor to use custom ConfigSection // app.config values for URL/User/Pass namespace myprogram.webservice { public partial class MyWebService { public MyWebService(string szURL) { this.Url = szURL; if ((this.IsLocalFileSystemWebService(this.Url) == true)) { this.UseDefaultCredentials = true; this.useDefaultCredentialsSetExplicitly = false; } else { this.useDefaultCredentialsSetExplicitly = true; } } } } 

我知道这是一个古老的问题,但我们的解决scheme比我在这里看到的要简单得多。 我们使用它与VS2010及以上的WCF调用。 stringurl可以来自应用程序设置或其他来源。 在我的情况下,这是一个下拉列表,用户select服务器。 该服务通过VS添加服务引用进行configuration。

 private void CallTheService( string url ) { TheService.TheServiceClient client = new TheService.TheServiceClient(); client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url); var results = client.AMethodFromTheService(); } 

只是关于静态和dynamic之间的区别。

  • 静态 :每次调用Web服务时都必须设置URL属性。 这是因为如果Web服务位于代理类构造函数中,则为基本URL。
  • dynamic :将在您的web.config文件中为您创build一个特殊的configuration密钥。 默认情况下,代理类将从这个键读取URL。

绝对使用Url属性是要走的路。 是否将其设置在app.config,数据库或第三个位置上取决于您的configuration需求。 有时,当您更改Web服务位置时,您不希望应用程序重新启动。 您可能没有负载平衡器缩放后端。 您可能正在热补丁的Web服务错误。 你的实现也可能有安全configuration问题。 无论是生产db用户名和密码,甚至是ws安全authentication信息。 适当的职责分离可以让你进入一些更多的configuration设置。

如果围绕代理生成的类添加包装类,则可以在每次创build包装类调用Web方法时以统一的方式设置Url属性。

如果从数据库中获取URL,则可以手动将其分配给Web服务代理类URL属性。 这应该在调用Web方法之前完成。

如果您想使用configuration文件,可以将代理类URL的行为设置为dynamic。

打开孤独的探险家

右键单击Web服务更改URL行为到dynamic

单击解决scheme资源pipe理器中的“显示所有文件”图标

在Web引用中编辑Reference.cs文件

改变constructer

 public Service1() { this.Url = "URL"; // etc. string variable this.Url = ConfigClass.myURL } 

对于我来说,一个WebService的引用是一个

服务参考

无论如何,这是非常容易的。 正如有人所说,你只需要改变web.config文件中的URL。

 <system.serviceModel> <bindings> <basicHttpBinding> <binding name="YourServiceSoap" /> </basicHttpBinding> </bindings> <client> **** CHANGE THE LINE BELOW TO CHANGE THE URL **** <endpoint address="http://10.10.10.100:8080/services/YourService.asmx" binding="basicHttpBinding" bindingConfiguration="YourServiceSoap" contract="YourServiceRef.YourServiceSoap" name="YourServiceSoap" /> </client>