代码如何在Web服务中运行?

时间:2011-05-16 18:29:13

标签: c# asp.net web-services

我目前正在研究一种旨在被众多不同瘦客户端使用的WebService。到目前为止,我一直在测试一个网站作为客户端。

我的问题是,网络服务有正确的课程。当有人登录使用Web服务的网站时,是否为使用它的某个人的实例实例化了主类?

例如在调试期间我有1个客户端。

  1. 服务从一个变量启动,该变量被设置为“Hello World”客户端请求服务中的字符串,然后将其发回。
  2. 然后服务更改内部 变量等于发送的变量 由客户。然后服务 追加2到最后,所以变量 现在是“Hello World 2”。
  3. 客户要求更新 字符串,并获取Hello World 2。
  4. 另一位用户登录。他们要求 期待Hello World的字符串 但是获得Hello World 2.现在的时候了 发送回来他们得到Hello World 2
    1. 这是一个不理想的结果,也是我想避免的。
  5. 我该怎么做?

2 个答案:

答案 0 :(得分:5)

如果要为新客户端重置状态,则需要跟踪哪些客户端已连接并正确地为它们提供数据。这可能需要调用来设置会话,以便您可以分配令牌并将其返回给客户端,然后将其用于所有后续呼叫。

另一种方法是使用WCF编写服务,然后使用PerSession InstanceContextMode,它将为每个会话构造一个新的服务对象。在这种情况下,您仍需要指示哪些呼叫开始会话以及哪些呼叫结束会话。有关更多信息,请参阅here

答案 1 :(得分:3)

ASP.NET中的WebService非常类似于客户服务呼叫中心。 HttpApplications的“池”,每个代表通过浏览器或其他程序连接到您的Web服务器,由ASP.NET服务器维护,主动处理服务调用或等待接收服务。当服务调用进入时,它将被路由到池中的空闲实例,该实例运行指定的方法并返回作为SOAP响应传输的结果(或使用您为服务设置的任何协议)。然后服务类返回其空闲状态。您的下一个电话可能由服务类别的另一个实例(“您的电话转移到下一个可用的代表”)处理,而不是处理您上次电话的那个。

对于几乎任何情况,这种架构都很好。作为运行的一部分,服务类实例可以读取和写入所有其他实例都可以访问的集中式数据存储,因此只要(a。)服务方法不需要任何专门信息来生成正确的回答,或(b。)服务可以从这个中央数据存储中获取任何专门信息,哪个实例处理每个呼叫都无关紧要。

但是,服务也支持会话状态。客户端可以被定向到服务,给它一些信息以便记住它而无需集中在任何地方,然后必须回调到同一个服务实例,以便在确定结果到达之前给它更多信息。为此,客户端从服务请求会话标识符;基本上就像在呼叫中心询问CSR直接扩展一样。一些工作在连接时完成,然后每一方都可以在没有连接的情况下关闭并执行其他工作,然后客户端将回调,提供它给出的会话标识符,并且其下一个服务调用将由处理该实例的实例处理最后的请求。当会话标识符未完成时,该服务将在池中保持空闲,“记住”它已经给出的任何信息,直到具有该会话标识符的客户端说它已完成(关闭会话),或者客户端未调用在一定时间内退出(超时)。