如何在HttpHandler中使用ASP.NET会话状态?

65

我有一个HttpHandler在客户端页面上运行(跨域,不在我们的IIS服务器上等),当他们点击我们嵌入的链接时,它会在我们的服务器上触发Handler。目前一切正常。

我现在正在尝试使用System.Web.HttpContext.Session对象,但它为null。我想这是因为在调用我们的HttpHandler之前没有会话吗?多次调用处理程序将每次创建一个新会话吗?如果是这种情况,微软是否禁用了调用HttpHandler时的Session对象?有人能证实这个吗?

如果是这样,您怎么维护调用之间的状态?某种基于SQL的数据对象?文件?

TIA

4个回答

149

让您的 HttpHandler 实现 IRequiresSessionState 接口,它会启用会话状态使用。 IRequiresSessionState 可在 System.Web.SessionState 命名空间中找到。


2
@Michael在一百万年里想不到那个。谢谢 :) - eran otzap
实现对我有用的代码: Public Class BasicHandler Implements IHttpHandler Implements IRequiresSessionState - Nick Kuznia

31
我认为您需要实现空接口IReadOnlySessionState,以便上下文被加载。
编辑添加:
根据Michael Morton的答案,您也可以实现IRequiresSessionState,这将使您对Session对象也具有写访问权限。

2
对于许多httphandler使用场景,IReadOnlySessionState是最好的选择,至少在仅检查会话状态而不保存它时如此。但这是更好的答案的主要原因是HttpHandler实现了IReadOnlySessionState或IRequiresSessionState,而不是继承(类只能从其他类继承)。 - JackArbiter
我们发现 IReadOnlySessionState 明显更快。 - David Homer

11
using System; 
using System.Web;
using System.Web.SessionState;
public class DownloadHandler : IHttpHandler, IReadOnlySessionState
{
   public bool IsReusable { get { return true; } }

   public void ProcessRequest(HttpContext context)
   {
       context.Response.Write(context.Session["kmx"]);
   }
}

-10

尝试使用当前上下文...

System.Web.HttpContext.Current.Session

除非他实现其中一个标记接口,否则它无法工作。 - Jhonny D. Cano -Leftware-
1
如果没有实现IRequiresSessionState / IReadOnlySessionState,会话将为空。 - Colin
1
我的错...我想的是HttpModules。 - Joe Davis
5
楼主说:我现在尝试使用 System.Web.HttpContext.Session 对象,但它是 null。 - Oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接