如何在不重新编译的情况下在.NET中动态切换Web服务地址?
我有引用Web服务的代码,并且我希望该Web服务的地址是动态的(从数据库,配置文件等读取),以便可以轻松更改它。此方法的主要用途是将其部署到计算机名称和IP地址不同的多个环境中。在所有部署中,Web服务签名将相同,仅位于其他位置。
也许我只是被Visual Studio宠坏了,但是"添加Web引用"向导似乎应该相对容易一些。
解决方案
将URL行为更改为"动态"。
当我们生成Web参考并在解决方案资源管理器中单击Web参考时。在属性窗格中,我们应该看到以下内容:
将值更改为dynamic将在app.config中放置一个条目。
这是CodePlex文章,具有更多信息。
如果要从数据库中获取URL,则可以将其手动分配给Web服务代理类URL属性。这应该在调用web方法之前完成。
如果要使用配置文件,可以将代理类的URL行为设置为动态。
只要Web服务方法和底层公开的类不发生变化,它都是微不足道的。使用Visual Studio 2005(及更高版本),添加Web引用会创建一个具有此URL的app.config(或者对于Web应用程序为web.config)部分。我们所要做的就是编辑app.config文件以反映所需的URL。
在我们的项目中,我们的简单方法是仅对每种环境类型(开发,测试,生产)注释app.config条目。因此,我们只是取消注释所需环境类型的条目。那里不需要特殊的编码。
只需说明一下静态和动态之间的区别。
- 静态:每次调用Web服务时都必须设置URL属性。这是因为基本URL(如果Web服务在代理类构造函数中)。
- 动态:将在web.config文件中为我们创建一个特殊的配置密钥。默认情况下,代理类将从该密钥读取URL。
如果要真正动态地设置此设置,则应设置要调用的代理类的实例的.Url字段。
在程序中的.config文件中设置值:
- 是一个烂摊子;
- 在下一个应用程序启动之前,可能无法读取。
如果每个安装只需要做一次,那么我会同意其他张贴者的意见,并使用.config文件和动态设置。
绝对可以使用Url属性。是否在app.config,数据库或者第三个位置中进行设置取决于配置需求。有时,我们不希望在更改Web服务位置时重新启动应用程序。我们可能没有扩展后端的负载均衡器。我们可能正在热修补Web服务错误。实现也可能存在安全配置问题。无论是生产数据库的用户名和密码,还是ws安全认证信息。正确划分职责可以使我们进入一些更复杂的配置设置。
如果在代理生成的类周围添加包装类,则可以在每次创建包装类以调用Web方法时以某种统一的方式设置Url属性。