如何在.NET中动态切换Web服务地址而无需重新编译?


70

我有引用Web服务的代码,并且我希望该Web服务的地址是动态的(从数据库,配置文件等读取),以便可以轻松更改它。这的主要用途是将其部署到计算机名称和IP地址不同的多个环境中。在所有部署中,Web服务签名将相同,仅位于其他位置。

也许我只是被Visual Studio“添加Web引用”向导宠坏了-似乎这应该相对容易一些。


您使用的是Visual Studio 2005还是2008。我相信每个向导都略有不同。
埃里克·舒诺弗

Answers:


58

当您生成Web参考并在解决方案资源管理器中单击Web参考时。在属性窗格中,您应该看到类似以下内容:

Web参考属性

将该值更改为dynamic将在您的app.config中放置一个条目。

这是CodePlex文章,具有更多信息。


1
当我发布app.config时,它会去哪里?我无法在发布输出目录中看到它
Shyju 2010年

3
它将重命名为[OutputAssemblyName] .config。示例:MyProject.exe.config
Eric Sc​​hoonover 2010年

3
在某些情况下,下面来自Brad Bruce的答案将更有帮助-您可以更改Web服务对象的Url属性。
SAJ14SAJ 2013年

我可以将值存储在machine.config中吗?
Uri Abramson

@Shyju,我正在使用小型.net包装器通过邮枪发送邮件api,正如您在代码中看到的那样,他们已将其编译https://api.mailgun.net/v2/为api版本2,我想将其更改为版本3 https://api.mailgun.net/v3/,该怎么办?
Shaiju T 2015年

31

如果要真正动态设置,则应设置要调用的代理类实例的.Url字段。

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

  1. 是一个烂摊子;

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

如果每个安装仅需要做一次,那么我同意其他张贴者的意见,并使用.config文件和动态设置。


10
例如。 var api = new MyApi.Service(); api.Url = "http://yetanotherurl.com";
Jeroen K

这就是我所做的,但是在生产中,该链接没有更改,它仍然采用旧的链接
。–

21

我知道这是一个老问题,但是我们的解决方案比我在这里看到的要简单得多。我们将其用于VS2010及更高版本的WCF调用。字符串网址可以来自应用设置或其他来源。在我的情况下,这是一个下拉列表,用户可以在其中选择服务器。通过VS添加服务参考来配置TheService。

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

1
很好,这似乎是最简单的解决方案,并且对我来说也适用于asmx Web服务。
germankiwi

这是关于WCF的,但发布者正在谈论Web参考或asmx Web服务
Silent Sojourner,

9

我已经为这个问题苦苦挣扎了几天,终于灯泡发出咔嗒声。能够在运行时更改Web服务URL的关键是重写构造函数,这是我使用部分类声明完成的。上面还将URL行为设置为Dynamic的操作也必须完成。

基本上,这将创建一个Web服务包装程序,如果您必须在某个时候通过添加服务引用来重新加载Web服务,则您不会丢失工作。Microsoft对Partial类的帮助特别指出,此构造的部分原因是要创建Web Service包装器。 http://msdn.microsoft.com/zh-CN/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;
            }
        }
    }
}


4

只要Web服务方法和底层公开的类不发生变化,它都是微不足道的。使用Visual Studio 2005(及更高版本),添加Web引用将创建具有此URL的app.config(或对于Web应用程序为web.config)部分。您所要做的就是编辑app.config文件以反映所需的URL。

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


3

只需说明一下静态和动态之间的区别。

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

2

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

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


1

绝对可以使用Url属性。是否在app.config,数据库或第三个位置中进行设置取决于您的配置需求。有时,您不希望在更改Web服务位置时重新启动应用程序。您可能没有扩展后端的负载均衡器。您可能正在热修补Web服务错误。您的实现也可能存在安全配置问题。无论是生产数据库的用户名和密码,还是ws安全认证信息。正确划分职责可以使您进入一些更复杂的配置设置。

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


0

开放式孤独浏览器

右键单击Web服务,将“ URL行为”更改为“动态”

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

在网络参考中,编辑Reference.cs文件

改变构造器

public Service1() {
        this.Url = "URL"; // etc. string  variable this.Url = ConfigClass.myURL
      }

0

对我而言,对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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.