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

我有引用 Web 服务的代码,我希望该 Web 服务的地址是动态的(从数据库、配置文件等读取) ,以便易于更改。这样做的一个主要用途是将其部署到机器名称和 IP 地址不同的多个环境中。所有部署的 Web 服务签名都是相同的,只是位于其他地方。

也许我只是被 Visual Studio 的“添加 Web 引用”向导宠坏了——不过,这似乎应该是相对容易的事情。

135172 次浏览

将 URL 行为更改为“ 充满活力”。

生成 Web 引用并单击解决方案资源管理器中的 Web 引用时。在属性窗格中,您应该看到如下内容:

Web Reference Properties

将值更改为 Dynamic 将在 app.config 中放入一个条目。

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

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

如果希望使用配置文件,可以将代理类的 URL 行为设置为动态。

只要 Web 服务方法和底层公开的类没有改变,就相当普通。使用 Visual Studio 2005(以及更新的版本) ,添加 Web 引用将创建一个包含此 URL 的 app.config (或 web.config,用于 Web 应用程序)部分。您所需要做的就是编辑 app.config 文件以反映所需的 URL。

在我们的项目中,我们的简单方法是按照环境类型(开发、测试、生产)对 app.config 条目进行注释。因此,我们只需取消注释所需环境类型的条目。不需要特殊的编码。

只是静态和动态之间的区别。

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

如果您确实要动态设置它,则应该将。正在调用的代理类的实例的 Url 字段。

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

  1. 一团糟;

  2. 在下一个应用程序启动之前可能无法读取。

如果它只是一些东西,需要做一次每安装,我会同意其他海报和使用。配置文件和动态设置。

肯定要使用 Url 属性。是否在 app.config、数据库或第三个位置中设置它取决于您的配置需求。有时你不希望应用程序重新启动时,你改变了网络服务的位置。您可能没有负载均衡器来扩展后端。您可能正在热修补 Web 服务 bug。您的实现也可能存在安全配置问题。无论是生产数据库用户名和密码,甚至是 wssecurity 认证信息。适当的职责分离可以让您进入一些更复杂的配置设置。

如果在代理生成的类周围添加一个包装类,那么每次创建调用 Web 方法的包装类时,都可以以某种统一的方式设置 Url 属性。

我在这个问题上挣扎了几天,终于灵光一现。能够在运行时更改 webservice 的 URL 的关键是覆盖构造函数,我使用了一个分部类声明。还必须执行上述操作,将 URL 行为设置为 Dynamic。

这基本上创建了一个 Web 服务包装器,在这个包装器中,如果您必须在某个时候通过添加服务引用来重新加载 Web 服务,那么您就不会丢失您的工作。Microsoft 对部分类的帮助特别指出,此构造的部分原因是创建 Web 服务包装器。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;
}
}
}
}

开放式孤立点探测器

右键单击 webservice 将 URL 行为更改为 Dynamic

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

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

变更构造函数变更构造函数

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>

我知道这是一个古老的问题,但我们的解决方案比我在这里看到的要简单得多。我们使用它与 VS2010及以上 WCF 调用。字符串 url 可以来自应用程序设置或其他来源。在我的例子中,它是一个用户选择服务器的下拉列表。TheService 是通过 VS 添加服务引用配置的。

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