我有引用 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.config,用于 Web 应用程序)部分。您所需要做的就是编辑 app.config 文件以反映所需的 URL。
在我们的项目中,我们的简单方法是按照环境类型(开发、测试、生产)对 app.config 条目进行注释。因此,我们只需取消注释所需环境类型的条目。不需要特殊的编码。
只是静态和动态之间的区别。
如果您确实要动态设置它,则应该将。正在调用的代理类的实例的 Url 字段。
在程序中设置.config 文件中的值:
一团糟;
在下一个应用程序启动之前可能无法读取。
如果它只是一些东西,需要做一次每安装,我会同意其他海报和使用。配置文件和动态设置。
肯定要使用 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(); }