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

Kei*_*ows 56 httphandler session-state

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

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

如果是这种情况,您如何维持呼叫之间的状态?某种基于SQL的数据对象?一份文件?

TIA

小智 137

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

  • @Michael 一百万年后也不会想到这一点,谢谢:) (2认同)

Jho*_*re- 27

我认为你必须实现空接口IReadOnlySessionState,因此将加载上下文.

编辑添加:

根据Michael Morton的回答,您还可以实现 IRequiresSessionState,它还将为您提供对Session对象的写访问权限

  • 对于许多httphandler使用,IReadOnlySessionState是最好的,至少当一个只检查会话状态而不保存它时,但主要原因是这是更好的答案是因为HttpHandler实现了IReadOnlySessionState或IRequiresSessionState而不是继承(类只能从其他类继承) . (2认同)

KMX*_*KMX 8

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"]);
   }
}
Run Code Online (Sandbox Code Playgroud)