为什么静态方法不能用作ASMX Web服务中的Web服务操作?

17

我想了解为什么我不能在 Web 服务中使用静态 web 方法?这个问题有何限制?

能否给我一个简明扼要的解释。


顺便提一下,你知道微软现在认为 ASMX Web 服务是“遗留技术”,并且他们已经停止在那里修复漏洞了吗?你应该使用 WCF。 - John Saunders
1
Atarikg,WCF在其实现中支持基本的Web服务以及更多功能(它是一个庞大而完整的框架)。它非常流畅。但我不确定静态方法是否可以在WCF服务中使用。 - Joshua Hudson
1
@Aaron:实际上,你对它的难度有所误解。创建一个新的WCF服务项目,看看“Hello, world”应用程序是多么简单。它并不比ASMX版本复杂多少,主要是因为它有两个操作。其中一个是演示数据契约。将配置文件中的绑定从wsHttpBinding更改为basicHttpBinding,它就像ASMX一样,只是不再是“遗留”的了。 - John Saunders
1
@Aaron。只要记住WCF的ABC(地址,绑定,契约),你就可以开始了。好处远远超过学习成本。而且,由于你正在编写契约,你会更加关注将要在服务中公开的数据,这总是一个优点。最后,能够使用多个绑定公开服务真的很棒。 - Joshua Hudson
为了方便其他人获取,我发现了一个对于初学者来说非常有用的 WCF 资源。http://msdn.microsoft.com/en-us/magazine/cc163647.aspx - Tarik
显示剩余4条评论
2个回答

23
答案是:因为您不能这样做。
这不是按照这种方式设计的。设计是创建Web服务类的实例,然后调用实例方法。
我只能猜测Microsoft为什么要这样设计。要想确定,您必须询问他们。请考虑以下事项:
  1. 允许静态方法没有特定的好处。您可以使用实例方法完成任何静态方法可以完成的工作。
  2. [WebService]类并不是指任意用作Web服务的类。它旨在成为您为公开Web服务操作而创建的类。因此,无需支持已经存在且已经具有静态方法的类。
  3. SOAP标头实现允许您的类包含继承自SoapHeader类的实例字段。该字段将填充传入的SOAP标头和/或包含要返回的SOAP标头。您不能使用静态字段进行此操作,因为每个请求都会被覆盖。
如我所说,这些都是猜测。回答这个问题的正确答案是:“您不能这样做,因为这是Microsoft的设计。如果您想知道他们为什么这样设计,请向他们咨询。”
顺便说一下,我刚刚检查了一下,似乎WCF也不允许静态方法成为操作。

3
但我想问的是为什么?他们为什么不直接说:“好了,伙计们,我们不会按照那个方案来设计这个东西,相反,它将会以这种方式设计。废话废话...”。我想知道背后的原因。 - Tarik
感谢您提供干净详细的答案。 - Tarik

3
当客户端为您的Web服务创建对象时,实际上是创建了一个代理对象来访问该Web服务。这个代理对象会为您处理一些事情,比如打开和关闭连接以及处理所有与Web服务实际交互的开销。使用静态方法调用将很难管理。如果使用“静态代理”(缺乏更好的术语),那么每次客户端调用其中一个静态方法时,都必须执行代理对象实例正在执行的所有操作,从而增加了巨大的开销。

我很确定他在谈论服务器端,而不是客户端。 - John Saunders
1
我的回答以我认为有助于解释为什么服务器端的静态方法不起作用的方式回答了他的问题。仅仅说Web服务是设计成不能这样做并不说明它们最初为什么被设计成这样。 - Joshua Hudson
1
客户端代理和服务端Web服务实例之间没有对应关系。如果是这种情况,那么它们如何相互通信呢? - Joshua Hudson
1
我这样认为,atarikg。我并不是微软的员工,也不是.NET团队的成员,但是我想任何可以保持Web服务简单且避免过多开销的事情都是制定此限制的好理由。 - Joshua Hudson
@Aaron:抱歉,但这与那完全没有任何关系。创建客户端代理的实例并不会创建服务类的实例。 - John Saunders
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接