如何在 ASHX 文件中设置会话变量

How do I set a session variable in an ASHX file

我正在尝试在 ASHX 文件中设置会话变量。我仔细阅读了一些内容,并了解了这一点:

  1. 我在调用 ASHX 处理程序的 ASPX 文件中设置了变量。
  2. 我尝试重置处理程序中的变量。

我收到一条错误消息,指出 'System.Web.HttpContext.Current.Session' 为空。就像我说过的,我已经阅读了一些资料,看起来好像这应该可行,但出于某种原因,我就是无法让它为我工作。

我添加了 using System.Web.SessionState;在我的处理程序的顶部,但这似乎没有做任何有用的事情。 Session 变量 ( HttpContext.Current.Session["saml_session_id"]) 被设置,但似乎不会持续存在。当我到达 aspx 文件并从我的直接 window 调用 HttpContext.Current.Session["saml_session_id"] 时,只返回 NULL。

我以此为指导 (How to access Session in .ashx file?),但显然遗漏了一些东西。

谁能告诉我吗?我会继续研究,如果我解决了这个问题,就会 post 解决方案。

请参阅下面的代码。

在我的 .aspx 文件中 - 我声明了我的会话变量:

HttpContext.Current.Session["saml_session_id"] = string.Empty;

然后在同一个文件中我post到ashx文件:

var response = Post("http://" + Request.ServerVariables["HTTP_HOST"].ToString() + "/API/Login.ashx", new NameValueCollection() {
            {"Username",Username},
            {"Password",Password}
        });

然后在我的 ashx 文件中有以下内容(这是精简版):

using System.Web.SessionState;

//Some validation happens and a string called session_id gets generated.

context.Session["saml_session_id"] = session_id;

//while I'm in the ashx file, context.Session["saml_session_id"] persists.

当处理程序中的请求完成处理时,ASPX 文件中的下一个代码是这样的:

  if (Response.Status.ToString() == "200 OK") {
            Context.Response.Redirect("../Play.aspx?SessionId=" + HttpContext.Current.Session["saml_session_id"].ToString());
        }

但是 HttpContext.Current.Session["saml_session_id"].ToString() 现在又是空白了。基本上看起来处理程序和 Web 表单没有通信或者会话没有被共享。我已经检查以确保名称空间相同。还有什么我应该检查的吗?

确保处理程序继承自 System.Web.SessionState.IRequiresSessionState,就像您提供的 link 一样。

如果导入命名空间,则不需要 HttpContext.Current 部分。

public class ImageHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
      string Name = "";
      if (context.Session["filename"] != null)
         Name = context.Session["filename"].ToString();
    }
}

这个问题是一个菜鸟错误,因为我从表单中得到了回复,但没有找到正确的地方。原来它是以字节为单位的,并且来自 ASHX 文件的会话 ID 在那里。

您需要做的就是导入

IRequiresSessionState

然后添加您的数据:

context.Session.Add("User", "Your Object");