我有一个值为static float x
的Web服务器(ASP.NET - Mono 2.6.7)和两个方法:getX()
和setX(newX)
。我还有两个客户端,一个是带有c#console应用程序的pc,另一个是带有android(ksoap2)的移动设备。两者都可以访问Web服务器。
我不知道的是:如果我的移动设备在我的电脑正在getX()
时尝试setX(newX)
,那会不会造成任何麻烦?
感谢。
答案 0 :(得分:2)
对服务进行状态完全实现并不是一个好习惯。您可以使用不同的实例来处理多个请求。 ASP.NET Web服务就是这种情况。在WCF中,使用配置,您可以更改实例化行为。例如,您可以让一个实例为所有请求提供服务(其中很少一个可以并发) - 如果一个实例具有可变状态(如您的情况),则必须同步对该状态的访问。共享状态下的线程同步将在提供请求时产生瓶颈,因为最多只有一个请求线程可以访问该状态。此外,您无法水平扩展(即,将从多台计算机提供请求的Web场方案)。如果您选择让多个实例为请求提供服务,那么您需要将状态外部化,例如:把它放到数据库中。在这种情况下,您将承担访问外部数据源(可能比线程同步高得多)的惩罚,但您将具有可扩展的设计。
答案 1 :(得分:1)
粗略地说,Web服务类/对象本身不应该是有状态的。您可以存储状态,但通常是外部的,例如在数据库中。
这是因为,根据配置,不能保证每个客户端的每个请求都是同一个类的实例。