【问题标题】:HTTPHandler : IRequiresSessionState halts execution of pagesHTTPHandler : IRequiresSessionState 停止执行页面
【发布时间】:2011-03-19 18:27:14
【问题描述】:

我有实现 IRequiresSessionState 的 ASHX HTTPHandler。当我调用此处理程序并在另一个窗口中调用同一应用程序的 aspx 页面时,aspx 页面不会开始处理,直到 ashx 页面完成处理。即使从两个不同的窗口调用同一个 ashx 页面,也会显示首先被调用的页面会执行,然后是下一个。

当我不实现 IRequiresSessionState 时,页面异步加载,无需等待其他页面完成。

对于希望在多个窗口中工作的最终用户来说,这可能是一个严重的瓶颈。

会话具有用户特定的数据。如果上述方法不起作用,需要另一种方法来存储会话的用户特定数据,可以在 HTTPHandler 中使用。

其他信息: - 我正在使用 ashx 处理程序来处理和发送内部需要 Session 的文件。

【问题讨论】:

  • 重现行为,看起来确实很吓人。通用处理程序中的一个简单的Thread.Sleep 会杀死所有其他请求。
  • IReadOnlySessionState 确实有效。
  • @Darnin:如前所述,我有 ASHX 处理程序,因此 Thread.Sleep 不应该杀死所有请求,而且它不在我的代码中。正在修改进程中的会话数据,所以我需要 IRequireSessionState。我也更有兴趣找出为什么会发生这种情况。

标签: asp.net session httphandler


【解决方案1】:

会话状态访问要求 aspx 页面和处理程序按顺序运行。每个页面/处理程序都可以读取和写入会话状态。为了在会话状态中不产生任何错误的情况下处理此问题,.net 一次只能运行一个。 正如 Darin 所建议的,以只读会话状态运行将改善这种情况。如果多个处理程序只需要读取访问权限,Asp.net 将允许它们同时运行。但是,该页面将需要对会话的写访问权限,因此当 aspx 页面本身运行时,不会运行任何处理程序。这是标准的多读者单写者锁定模式。您可以同时拥有多个阅读器,但只能拥有一个编写器。

实现这项工作的唯一方法是让处理程序不需要会话状态,以便它们在运行 aspx 页面的同时运行。

您可以通过寻找另一种方法来存储此数据而不是使用会话状态来解决此问题。您可以实现自己的共享缓存/数据结构,但您也需要为该结构提供类似的锁定(多读取器/单写入器)。

【讨论】:

  • 所以我相信这只会为处理程序正在进行处理的那个会话锁定页面处理。其他用户应该无需等待即可访问页面。对吗?
  • 是的。这是一个基于会话的锁,只会阻止使用同一会话的其他请求。具有不同会话的其他用户将能够访问同一页面而不会被阻止。
【解决方案2】:

除了@Mike 关于IRequiresSessionState 强制每个“用户”(会话)一次只处理一个请求的观点之外,还有另一个理由想要这样做。

假设您有一个 ajax 服务(使用通用处理程序 - *.ashx 实现),它根据发布的数据为特定用户执行“更新”。假设更新很重(大约 250 毫秒)并且涉及到数据库的“读取/合并/写入”过程(再次将数据隔离给单个用户)。但是,客户端(应用程序、网站等)可以快速连续执行多个调用,而服务器无法控制。

通过实现IRequiresSessionState(只需将其作为通用处理程序的接口包含在内)ASP.NET 将确保对于给定用户/会话 的请求得到串行处理。但是,多个用户仍然可以并行调用更新。这可以让我们避免“丢失更新问题”,因为在第一个请求完成更新之前,第二个请求不会检索数据副本。

public class SaveDataHandler : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        // Read request parameters
        // Read database (user specific data)
        // Process
        // Write back to database (user specific data)
    }

    public bool IsReusable => false;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 2011-07-03
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多