代码如何在 Web 服务中运行

本文关键字:服务 运行 Web 代码 | 更新日期: 2023-09-27 17:56:29

我目前正在开发一种WebService,该服务旨在被许多不同的瘦客户端使用。到目前为止,我一直在用 1 个网站作为客户端对其进行测试。

我的问题是,Web服务具有正确的类。当有人登录到使用该 Web 服务的网站时,主类是否为使用它的人的实例实例化?

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

  1. 该服务从一个变量开始,该变量被固定为"Hello World"客户端从服务请求字符串,然后将其发回。
  2. 然后,服务更改内部变量等于发送的变量由客户。然后服务。将 2 附加到末尾,因此变量现在是《你好世界2》。
  3. 客户要求更新字符串,并获取 Hello World 2。
  4. 另一个用户登录。他们要求字符串,期待你好世界但得到你好世界2。现在当发回去,他们得到你好世界2
    1. 这是一个不希望的结果,也是我试图避免的。

我该怎么做?

代码如何在 Web 服务中运行

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

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

ASP.NET 中的Web服务的工作方式很像客户服务呼叫中心。HttpApplications的"池",每个应用程序代表通过浏览器或其他程序与您的Web服务器的连接,由 ASP.NET 服务器维护,主动处理服务呼叫或等待接收服务呼叫。当服务调用传入时,它将从池路由到空闲实例,该实例运行指定的方法并返回作为 SOAP 响应(或使用您为服务设置的任何协议)传输的结果。然后,服务类返回到其空闲状态。您的下一个呼叫可能由处理上一个呼叫的服务类实例("您的呼叫正在转接给下一个可用代表")处理

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

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