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

Asp.net 如何在ASHX文件中设置会话变量,asp.net,session,webforms,ashx,Asp.net,Session,Webforms,Ashx,我正在尝试在ASHX文件中设置会话变量。我读了一点,并取得了这样的成就: 我在ASPX文件中设置了调用ASHX处理程序的变量 我试图重置处理程序中的变量 我收到一个错误,说明“System.Web.HttpContext.Current.Session”为空。就像我说的,我读了一些书,看起来这应该行得通,但出于某种原因,我就是不能让它对我起作用 我添加了使用System.Web.SessionState;在我的处理程序的顶部,但这似乎没有做任何有用的事情。会话变量(HttpContext.Cur

我正在尝试在ASHX文件中设置会话变量。我读了一点,并取得了这样的成就:

  • 我在ASPX文件中设置了调用ASHX处理程序的变量
  • 我试图重置处理程序中的变量
  • 我收到一个错误,说明“System.Web.HttpContext.Current.Session”为空。就像我说的,我读了一些书,看起来这应该行得通,但出于某种原因,我就是不能让它对我起作用

    我添加了使用System.Web.SessionState;在我的处理程序的顶部,但这似乎没有做任何有用的事情。会话变量(HttpContext.Current.Session[“saml_Session_id”])将使用该变量进行设置,但似乎不会持久化。当我从即时窗口访问aspx文件并调用HttpContext.Current.Session[“saml_Session_id”]时,只返回NULL

    我已经将此用作指导(),但显然我遗漏了一些东西

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

    请参阅下面的代码

    在my.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文件中,我有以下内容(这是一个精简版本):

    处理程序中的请求完成处理后,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.irequiresessionstate
    ,就像您提供的链接一样

    如果导入名称空间,则不需要使用
    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();
        }
    }
    

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

    如果导入名称空间,则不需要使用
    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就在那里。

    这是一个新手的错误,因为我从表单中得到了一个响应,但没有找到正确的位置。结果显示它是以字节为单位的,并且ASHX文件中的会话id就在那里。

    您所需要做的就是导入

    iRequestResessionState

    然后添加您的数据:


    context.Session.Add(“用户”、“您的对象”)

    您只需导入

    iRequestResessionState

    然后添加您的数据:


    context.Session.Add(“用户”、“您的对象”)

    @kickinchicken将代码放在问题中,而不是评论中。请意识到,你应该把它放在第一位,当问题是为什么你的代码不工作时,我们不应该问你的代码。梅森-我已经把它放在了问题中。我很抱歉冒犯了你。请把声音调小一点。如果你注意到我已经回答了我自己的一些问题。这是一个人们互相帮助的社区。如果你不耐烦和贬损他人,请不要回答,因为那没有帮助。@kickinchicken我没有生气,我只是想帮助你。如果你想得到适当的帮助,学会如何正确地提问是很重要的。@kickinchicken将你的代码放在问题中,而不是评论中。请意识到,你应该把它放在第一位,当问题是为什么你的代码不工作时,我们不应该问你的代码。梅森-我已经把它放在了问题中。我很抱歉冒犯了你。请把声音调小一点。如果你注意到我已经回答了我自己的一些问题。这是一个人们互相帮助的社区。如果你不耐烦和贬损他人,请不要回答,因为那没有帮助。@kickinchicken我没有生气,我只是想帮助你。如果你想得到适当的帮助,你必须学会如何正确地提问。为什么你要从服务器端代码发布到同一代码,而不是直接调用代码?我的猜测是,由于服务器正在发布数据,而不是用户,因此它被视为一个新会话。您应该让客户端发布数据,或者直接从代码隐藏中自己的代码调用服务器端代码。这是我继承的代码,我正在尝试使用相同的身份验证逻辑实现SAML调用。最初的表单发布是通过jquery完成的。我没有这样做,而是实现SAML调用——检查断言是否有效,然后发布到原始ASHX文件。我想我只要做一块饼干就可以了。我将发布我的解决方案。为什么您要从服务器端代码发布到同一代码,而不是直接调用代码?我的猜测是,由于服务器正在发布数据,而不是用户,因此它被视为一个新会话。您应该让客户端发布数据,或者直接从代码隐藏中自己的代码调用服务器端代码。这是我继承的代码,我正在尝试使用相同的身份验证逻辑实现SAML调用。最初的表单发布是通过jquery完成的。我没有这样做,而是实现SAML调用——检查断言是否有效,然后发布到原始ASHX文件。我想我只要做一块饼干就可以了。我将发布我的解决方案。