.NET Web服务每次方法调用都会实例化吗?

8
我正在尝试使用Web服务来实现我的想法。 在调试中,每当客户端调用Web服务方法时,Web服务类似乎都会被实例化。我可以通过看到每次调用方法时构造函数被调用来证实这一点。 在客户端中,我只实例化代理Web服务一次。
这意味着我必须在调用之间存储所有数据,并且如果我使用数据库,每次调用方法都需要重新连接。 这不可能是正确的吧?

为什么?这就是网页的工作方式,而 Web 服务实际上只是一个具有替代功能的网页。 - Spencer Ruport
好的,就像一个网页。烦人!我会尝试WCF的想法。谢谢。 - Richard210363
Spencer Ruport:如果你之前没有处理过网页或者其他无状态的框架,一开始可能会感觉很奇怪。毕竟,在有状态的框架中,你不需要多次进行那么多额外的工作。 - Halvard
即使你使用 WCF,你也应该尽力避免状态。请记住,在分布式系统中,您应该预期任何一台机器随时可能断开连接或重新启动。如果服务器维护状态,它就成为了一个弱点。除了稳定性之外,这还会影响可扩展性,因为集群需要共享该状态。 - Steven Sudit
我正在考虑一个服务,向访问网络服务的任何人提供信息(单个数字)。每次请求都必须重新制作数据库连接似乎是一个巨大的开销。我能绕过这个问题吗? - Richard210363
3个回答

5

这是正确的。

Web服务(在面向服务的架构中)应该是无状态的(它们不会在调用之间记住任何东西...所有数据持久性都由您自己控制)。

如果您在网络上搜索足够长的时间,您可能会发现尝试创建有状态Web服务的企图(虽然它们确实有其位置,但违反了SOA的核心原则)。 但是,您会发现它们无法缓解您的担忧。 每次调用都会得到一个新的类实例,并且必须重新创建与数据库的任何连接。


4
对于ASMX而言,它是正确的,也是一个很好的事情。服务应该尽可能地无状态,如果你真的需要在调用之间存储一些东西,那么可以使用单例模式。我认为持有数据库连接不符合要求,因为它们被缓存,而且你想要控制使用范围。
如果你想让一个对象在调用之间保持活动状态,WCF确实提供了这个选项。鉴于ASMX已经过时,你可能想要转向WCF。

1
或许还不完全过时,微软使用的词是“遗留”。 - John Saunders

2

是的,这是100%正确的。每当服务器接收到请求时,都会实例化一个新对象在单独的线程上处理该请求。

这与基本的ASP.NET Web表单发生的事情相同。


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