【问题标题】:Is it OK to use a singleton ASMX web service proxy?可以使用单例 ASMX Web 服务代理吗?
【发布时间】:2011-06-20 17:49:27
【问题描述】:

我正在使用一些<gulp>遗留代码使用 ASMX Web 服务以 .NET 3.5 编写。

Windows 服务(称为 FooService)为 Web 服务(称为 BarWS)静态缓存一个 ASMX 代理,它每小时响应客户端请求约 10-30 次调用该代理。

作为<gulp> 遗留代码,由于各种原因,测试起来非常困难。我正在打破依赖关系以使其可测试,这个静态引用让我想知道。自从我使用 ASMX 以来已经有好几年了,我记得代理是线程安全的 - 但我想知道它是否会变得不可用,就像单例/共享 WCF 代理在出现问题并出现故障时一样。

鉴于此代理的轻量使用(BarWS 的调用次数少于 30 次/小时),我认为在每次调用时创建一个新代理会更安全 - 但我只是想知道我是否会创建一个不必要的改变。有人知道吗?

附:我知道 WCF 更好,但是现在在这个 <gulp> 旧代码库中迁移到 WCF 的变化太大了。

【问题讨论】:

  • legacy.NET 3.5...哇...我感觉老了! :)
  • 斜体两次的legacy code有什么意义?
  • @James:您不必将服务更改为 WCF,但可以考虑更改为使用“服务引用”而不是“Web 引用”。
  • 遗留代码的一个定义是没有测试的代码,因此您也可以在 .NET 4.0 中轻松编写遗留代码
  • 公平地说,大部分遗留代码是用 .NET 2.0 编写的,随后又重新编译。斜体强调的更多是 legacy 是一种俚语,表示非常糟糕的未经测试的代码(参见 Michael Feathers 的开创性“使用遗留代码”,它推广了这个定义)。假设这个代理出现在一个包含 8000 行代码的方法的类中......

标签: c# web-services asmx


【解决方案1】:

衡量创建代理需要多长时间。如果这是一个错误的优化(我强烈怀疑它是),那么将其更改为基于实例的创建。避免静电通常是件好事。把它放在工厂后面,那么如果你真的想要的话,至少你仍然可以有单例类型的行为,但是这种创建行为会被屏蔽并且独立于客户端。

【讨论】:

  • 我 99% 确定这是一个错误的优化...不过我非常喜欢工厂的想法 - 谢谢。我正在投票赞成这个答案,但没有勾选它,因为它并没有完全解决有关代理实例在失败后的可重用性的问题。谢谢!
  • @James 当然,我不知道(不记得)它是否是有状态的。如果是,你显然还有一个更大的问题:它是线程安全的吗?
  • MSDN 文档声称它是线程安全的——但我尚未对此进行测试。测试它以及失败时的行为非常棘手,因为该服务的唯一实现(当然)是一个实时生产服务(没有 WSDL,没有源代码:) )没有摆脱它,我将不得不进行逆向工程假的!
  • @James 如果我没记错的话,您可以通过在服务 URL 上添加“?wsdl”来获取 wsdl。
  • 好主意...如果服务器端的 Web 服务似乎没有使用自定义 java 实现手动启动。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 2013-12-20
  • 2013-03-27
相关资源
最近更新 更多