【问题标题】:Why are Static Methods not Usable as Web Service Operations in ASMX Web Services?为什么静态方法不能用作 ASMX Web 服务中的 Web 服务操作?
【发布时间】:2010-11-18 19:14:01
【问题描述】:

我只是想了解为什么我不能在 Web 服务中使用静态 Web 方法?为什么会被限制?

谁能给我一个简明的解释。

【问题讨论】:

  • 顺便说一句,您是否知道 Microsoft 现在将 ASMX Web 服务视为“遗留技术”,并且他们已停止修复那里的错误?您应该使用 WCF。
  • Atarikg,WCF 在它的实现中支持基本的 web 服务以及更多(它是一个巨大的、完整的框架)。它非常光滑。我不确定 WCF 服务中是否允许使用静态方法,尽管我不以为然。
  • 谢谢你。我实际上正在搜索 WCF,它看起来很漂亮:)
  • @Aaron:实际上,您误解了它的难度。创建一个新的 WCF 服务项目,看看“Hello, world”应用程序是多么简单。并不比 ASMX 版本复杂多少,主要是因为它有两个操作。一是展示数据合约。将配置文件中的绑定从 wsHttpBinding 更改为 basicHttpBinding,它就像 ASMX,只是不是“旧版”。
  • @Aaron。只要记住你的 WCF 的 ABC 就可以了(地址、绑定、合同)。好处远大于学习。此外,由于您正在编写合同,因此您会更多地考虑要通过服务公开的数据,这始终是一个优势。最后,公开具有多个绑定的服务的能力确实很巧妙。

标签: c# asp.net web-services asmx


【解决方案1】:

答案是:因为你不能。

它不是这样设计的。设计是创建web服务类的实例,然后调用实例方法。

我只能猜测为什么微软会这样设计它。要确定,你必须问他们。考虑:

  1. 允许使用静态方法并没有什么特别的好处。你可以用静态方法做的任何事情,你也可以用实例方法做。
  2. [WebService] 类并不是碰巧用作 Web 服务的任意类。它是您为公开 Web 服务操作而创建的一个类。因此,无需支持已存在且已具有静态方法的类。
  3. SOAP Header 实现允许您的类包含派生自SoapHeader 类的类型的实例字段。该字段将填充传入的 SOAP 标头和/或将包含要返回的 SOAP 标头。您不能对静态字段执行此操作,因为它会被每个请求覆盖。

正如我所说,这些都是猜测。这个问题的正确答案是,“你不能,因为微软就是这样设计的。如果你想知道他们为什么这样设计,你需要问他们”。


FWIW,我刚刚检查过,WCF 似乎也不允许静态方法作为操作。

【讨论】:

  • 但我在问为什么?他们不会简单地说“好吧,伙计们,我们不会那样设计这个东西,相反,它会以这种方式设计。等等等等”。我要问的是这背后的原因。
  • 感谢您干净而详尽的回答。
【解决方案2】:

当客户端为您的 Web 服务创建对象时,他们真正创建的是该 Web 服务的代理对象。这个代理对象处理诸如打开和关闭连接之类的事情,以及实际使用 Web 服务的所有开销。静态方法调用将难以管理。由于没有更好的词,“静态代理”必须执行代理对象的实例在每次客户端调用其中一个静态方法时所做的所有事情,从而增加大量开销。

【讨论】:

  • 我很确定他说的是服务器端,而不是客户端。
  • 我的回答以我认为有助于解释为什么服务器端的静态方法不起作用的方式回答了他的问题。只是说 Web 服务是这样设计的,这并不能说明为什么它们最初是这样设计的。
  • 但这不是原因。服务器上发生的事情与客户端上发生的事情几乎没有关系。客户端代理和服务器端 Web 服务实例之间没有对应关系。服务器端不会仅仅因为客户端代理而被实例化。基于这个推理,我将不得不投反对票。
  • "客户端代理和服务器端web服务实例之间没有对应关系。"如果是这样的话,两人怎么会说话呢……
  • 我相信是这样。我不为 Microsoft 工作,也不是 .NET 团队的成员,但我认为任何使 Web 服务保持简单同时避免开销的做法都是做出此限制的一个很好的理由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2013-03-27
相关资源
最近更新 更多