【问题标题】:ASP.NET Configurable Web ServiceASP.NET 可配置 Web 服务
【发布时间】:2012-10-09 21:48:16
【问题描述】:

我在 ASP.NET 2.0 网站项目中有一个 Web 服务引用。我希望能够在服务的暂存版本和生产版本之间切换,而无需更改我的代码。

但是,我没有看到如何以干净的方式做到这一点。我知道我可以更改 web.config 以指向其他一些服务 URL,但是我的代码不是仍然硬编码到一个引用或另一个引用吗?

我看到了this post,但是你如何编辑代理类呢?如果我在类上“转到定义”,它不会带我到任何我可以编辑的类,但它是对象浏览器...我是否需要运行 wsdl.exe 实用程序以便它生成代理为我上课,然后我可以编辑?

编辑#1:这是我用来实例化和调用服务的代码:

Dim service As New Swan.MagellanLeadSheetService()
Dim response As Swan.MagellanLeadSheetResponse = service.Foo(stuffToSendToService)

编辑#2:由于 web.config 已经在 appSettings 区域中有 URL 端点地址,我可以在部署到生产时简单地编辑该设置以指向生产 URL 吗?就这么简单吗?我担心在 Staging 与 Production 的代理类之间可能会发生破坏性更改,但我认为应该在将任何更改部署到 Production 之前解决这些问题。

【问题讨论】:

  • 您可能会遇到两个困难:一,您被困在使用 .NET 2.0,因此您被困在使用 ASMX Web 服务,这是一种不应该用于新开发的遗留技术,第二:您使用的是网站而不是 Web 应用程序项目。除了最简单的应用程序之外,网站不应用于任何用途。您使用 Web 服务这一事实意味着您没有最简单的应用程序。

标签: asp.net web-services


【解决方案1】:

以下文章解释了如何通过更改引用属性、向 web.config 文件添加键并在应用程序代码中引用此键来使 Web 服务引用动态化:

Article Link

基本上,您将拥有 2 个版本的 web.config 文件,生产和暂存,并定义了不同的 URL。而代码将指向一个唯一的位置。

更新:

现在,在以下行之前,您必须根据 web.config 中的内容更改 service.URL。

Dim response As Swan.MagellanLeadSheetResponse = service.Foo(stuffToSendToService)

【讨论】:

  • 我阅读了这篇文章,但我的解决方案看起来不同。在我的 web.config 中,它已经将 appSettings 中的 web.config 引用添加到服务的暂存版本。但是,我没有看到任何 Reference.cs(或任何 .vb,因为我在 VB 项目中)。我有一个“App_WebReferences”文件夹,它下面有命名空间文件夹,下面有一个 .discomap 文件,下面有 .wsdl。在 Studio 外部看,除了 .discomap 和 .wsdl 之外没有其他文件。我在 Visual Studio 2010 的 VB.NET 2.0 项目中。
  • 您能否发布用于创建新 Web 服务实例并调用该服务的代码?您也可以在问题中添加 VB.net 标签。
  • 这里是初始化服务实例的代码:Dim service As New Swan.MagellanLeadSheetService()。 (所以我在添加引用时给服务起的名字是“Swan”。)如果我在那个类上右键单击“转到定义”,我会转到对象浏览器而不是一些 Reference.vb 或其他什么。为了发送数据,我只是在做 service.Foo(stuffToSend)。 VB.net 标签是什么意思?
  • 我的意思是编辑您的问题,将代码放在那里并添加一个新标签 VB.net,以便人们在进入阅读问题之前知道它与之相关。 cmets 上的代码读起来完全不爽。
  • 好的,我在主要问题中添加了 2 个编辑,包括我评论中的代码。
【解决方案2】:

首先这里是一些关于如何为您的项目添加网络引用的信息:

How to: Add and Remove Web References

然后你的 webservice 类的实例(从 SoapHttpClientProtocol 派生的代理类)必须有一个名为 url 的属性,使用该属性你可以在运行时从暂存或生产切换到你的 asmx。

CountryService service = new CountryService();
service.Url = "http://foo/bar.asmx";

更多信息:WebClientProtocol.Url Property

【讨论】:

  • 感谢您的回复。我在您提供的链接中正确添加了网络参考。但是,这样做之后,我的解决方案中没有可见的代理类。没有类派生自 SoapHttpClientProtocol。这可能是 VB.NET 与 C# 的区别吗?
  • 我不知道,Visual Studio 是否创建了 Reference.cs?
  • 我在一个 VB.NET 网站上。未创建 Reference.cs 或 Reference.vb 文件(在 Visual Studio 外部查看时也不会出现在文件资源管理器中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2011-07-26
  • 2011-08-14
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多