HTTPHandler:IRequiresSessionState停止执行页面

时间:2010-07-22 19:39:24

标签: asp.net session httphandler

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:0)

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

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

通过实现IRequiresSessionState(简单地将其作为Generic Handler的接口包含在内),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;
}