【问题标题】:How do I set a session variable in an ASHX file如何在 ASHX 文件中设置会话变量
【发布时间】:2015-01-13 19:00:56
【问题描述】:

我正在尝试在 ASHX 文件中设置会话变量。我读了一点,并走到这一步:

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

我收到一条错误消息,提示“System.Web.HttpContext.Current.Session”为空。就像我说的那样,我已经阅读了一些内容,似乎这应该可以工作,但由于某种原因,我无法让它为我工作。

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

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

谁能给我建议?我会继续研究,如果我解决了这个问题,我会发布解决方案。

在下面查看我的代码。

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

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

然后在同一个文件中我发布到 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 表单没有通信或会话没有被共享。我已经检查以确保命名空间是相同的。还有什么我应该检查的吗?

【问题讨论】:

  • 为什么要从服务器端代码发布到相同的代码,而不是直接调用代码?我的猜测是,由于服务器正在发布数据,而不是用户,因此它被视为新会话。您应该让客户端发布数据,或者直接从您自己的代码中的代码中调用服务器端代码。
  • 谢谢 - 我对新会话有了类似的认识。这是我继承的代码,我正在尝试使用相同的身份验证逻辑来​​实现 SAML 调用。初始表单发布是通过 jquery 完成的。我没有这样做,而是实现了 SAML 调用 - 检查断言是否有效,然后发布到原始 ASHX 文件。我想我会设置一个cookie并完成它。我将发布我的解决方案。

标签: asp.net session webforms ashx


【解决方案1】:

确保处理程序继承自 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();
    }
}

【讨论】:

  • @kickinchicken 将您的代码放在问题中,而不是在评论中。请注意,您应该首先包含它,当问题是关于您的代码为什么不起作用时,我们不应该要求您提供代码。
  • 梅森 - 我已经把它放到了问题中。非常抱歉冒犯了你。请把它调低一点。如果你注意到我实际上已经在这里回答了我自己的一些问题。这是一个人们互相帮助的社区。如果您要不耐烦和贬损,请不要回答,因为这没有帮助。
  • @kickinchicken 我没有被冒犯——我想帮助你。如果您想获得体面的帮助,学习如何正确提问是很重要的。
【解决方案2】:

你需要做的就是导入

IRequiresSessionState

然后添加您的数据:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      相关资源
      最近更新 更多