我有引用 Web 服务的代码,我希望该 Web 服务的地址是动态的(从数据库、配置文件等读取),以便轻松更改。它的一个主要用途是部署到机器名称和 IP 地址不同的多个环境中。Web 服务签名在所有部署中都是相同的,只是位于其他位置。
也许我刚刚被 Visual Studio“添加 Web 引用”向导宠坏了——不过,这似乎应该是相对容易的事情。
我有引用 Web 服务的代码,我希望该 Web 服务的地址是动态的(从数据库、配置文件等读取),以便轻松更改。它的一个主要用途是部署到机器名称和 IP 地址不同的多个环境中。Web 服务签名在所有部署中都是相同的,只是位于其他位置。
也许我刚刚被 Visual Studio“添加 Web 引用”向导宠坏了——不过,这似乎应该是相对容易的事情。
当您生成 Web 引用并单击解决方案资源管理器中的 Web 引用时。在属性窗格中,您应该会看到如下内容:
将值更改为动态将在您的 app.config 中添加一个条目。
这是包含更多信息的CodePlex 文章。
如果你真的是动态设置它,你应该设置你正在调用的代理类实例的 .Url 字段。
在程序中设置 .config 文件中的值:
是一个烂摊子;
在下一个应用程序启动之前可能不会被读取。
如果每次安装只需要完成一次,我会同意其他海报并使用 .config 文件和动态设置。
我知道这是一个老问题,但我们的解决方案比我在这里看到的要简单得多。我们将它用于 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();
}
我已经为这个问题苦苦挣扎了几天,最后灯泡发出了咔嗒声。能够在运行时更改 Web 服务的 URL 的关键是覆盖构造函数,我使用部分类声明进行了此操作。如上所述,将 URL 行为设置为 Dynamic 也必须完成。
这基本上创建了一个 Web 服务包装器,如果您必须在某个时候重新加载 Web 服务,通过添加服务引用,您不会丢失您的工作。Microsoft 对 Partial 类的帮助特别指出,这种构造的部分原因是创建 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;
}
}
}
}
将 URL 行为更改为“动态”。
只要 Web 服务方法和底层公开的类没有改变,它就相当简单。在 Visual Studio 2005(及更高版本)中,添加 Web 引用会创建一个包含此 URL 的 app.config(或 web.config,对于 Web 应用程序)部分。您所要做的就是编辑 app.config 文件以反映所需的 URL。
在我们的项目中,我们的简单方法是根据环境类型(开发、测试、生产)对 app.config 条目进行注释。因此,我们只需取消注释所需环境类型的条目。那里不需要特殊编码。
只是关于静态和动态之间差异的说明。
如果您从数据库中获取 URL,您可以手动将其分配给 Web 服务代理类 URL 属性。这应该在调用 web 方法之前完成。
如果您想使用配置文件,可以将代理类 URL 行为设置为动态。
绝对使用 Url 属性是要走的路。是否将其设置在 app.config、数据库或第三个位置取决于您的配置需求。有时您不希望应用程序在您更改 Web 服务位置时重新启动。您可能没有负载均衡器来扩展后端。您可能正在热修补 Web 服务错误。您的实现也可能存在安全配置问题。无论是生产数据库用户名和密码,还是 ws 安全身份验证信息。适当的职责分离可以让您进入一些更复杂的配置设置。
如果您在代理生成的类周围添加一个包装器类,则可以在每次创建包装器类以调用 Web 方法时以某种统一的方式设置 Url 属性。
打开孤岛探索者
右键单击 Web 服务将 URL 行为更改为动态
单击解决方案资源管理器中的“显示所有文件”图标
在网络参考中编辑 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>