如何在不重新编译的情况下在.NET中动态切换Web服务地址?

时间:2020-03-06 14:38:32  来源:igfitidea点击:

我有引用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属性。