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

kic*_*ken 0 asp.net session webforms ashx

我正在尝试在ASHX文件中设置会话变量。我读了一些,到此为止:

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

我收到一个错误消息,说“ System.Web.HttpContext.Current.Session”为空。就像我说过的那样,我已经读了一些书,并且看起来似乎应该起作用,但由于某种原因,我无法使它对我有用。

我使用System.Web.SessionState添加;在我的处理程序顶部,但这似乎没有任何用处。为此设置了Session变量(HttpContext.Current.Session [“ saml_session_id”]),但似乎没有持久化。当我进入aspx文件并从我的直接窗口调用HttpContext.Current.Session [“ saml_session_id”]时,仅返回NULL。

我已经以此为指导(如何访问.ashx文件中的Session?),但是显然缺少了一些东西。

谁能告诉我?我将继续研究,如果解决此问题,将发布解决方案。

请参阅下面的代码。

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

HttpContext.Current.Session["saml_session_id"] = string.Empty;
Run Code Online (Sandbox Code Playgroud)

然后在同一个文件中,将其发布到ashx文件中:

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

然后在我的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.
Run Code Online (Sandbox Code Playgroud)

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

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

但是HttpContext.Current.Session [“ saml_session_id”]。ToString()现在再次为空。基本上看起来好像处理程序和Web表单未通信或会话未共享。我已检查以确保名称空间相同。我还有什么要检查的吗?

mas*_*son 5

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

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