使用 Session 在 .aspx 文件和 .ashx 文件之间传递数据

4

实际上,我正在尝试从.aspx文件发送数据到.ashx文件。我正在使用.asps中的Session,并尝试在.ashx中获取session的值,但是它显示异常:对象引用未设置为对象的实例。

这是我的代码:

.aspx代码

[WebMethod(enableSession:true)]
public static string SetId(string Id)
{
    HttpContext.Current.Session["MId"] = Id.ToString(); Console.Write(" ");
    string session = HttpContext.Current.Session["MId"].ToString(); // Here I am getting value

    //string session = HttpContext.Current.Session["MId"].ToString();
    //BatchReadEmails.EmailProperties session = new BatchReadEmails.EmailProperties();
    //session.MailId = Id.ToString();

    return "Ok";
}

我正在从字符串会话中获取值。
.ashx 代码:

 public class ChangeLogHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState 
            {

                public void ProcessRequest(HttpContext context)
            {
                HttpRequest request = context.Request;
                HttpResponse response = context.Response;
                  string session = "";

                if (context.Session["MId"] != null)
                    session = context.Session["MId"].ToString();
                else
                    session = "Hello India";


            }
            }

这里显示的是 session = "Hello India"

我的问题:

  1. 有没有办法从 .aspx 文件发送数据到 .ashx 文件?

  2. 我查了很多链接,都使用 if 判断是否为 null,但我已经在 .aspx 文件中检查过,它显示有值,但在 .ashx 文件中却显示为空。为什么?(对于特殊情况,我们可以使用 if 条件语句,但我已经检查过字符串 session 有值)。

我有什么遗漏吗?谢谢。

这些是我已经使用过的链接:

如何在 .ashx 文件中访问 Session?
在 C# 中访问上下文会话变量


我注意到你在页面中使用了一个WebMethod来设置会话值。如果您在主Page_Load中设置会话值,它是否有效? - Jon Egerton
是的,如果我在 Page_Load 中定义它,它就会出现。 - Shyam Dixit
你确定在调用ashx之前执行了webmethod吗? - Jon Egerton
是的,它已经执行了。我正在使用“session”变量来检查它是否包含某些内容。 - Shyam Dixit
你能更新ashx代码吗?因为代码无法编译(因为代码只在类体中)。请看我的SSCCE评论-如果您想要建设性的帮助并且不让人感到沮丧,这很重要。 - Jon Egerton
3个回答

3
在aspx中,您正在添加Session["MId"]。在ashx中,您正在读取Session["MailId"]
请确保使用相同的键(即MIdMailId),而不是两者都用。
建议您定义一个常量来定义此值,因为它是共享的,这样就可以避免这类问题。

很抱歉,但实际上它们是相同的。我尝试了很多方法,最后它变成了MailId。但它还是一样的。 - Shyam Dixit
那么请确保您展示的代码是真正存在问题的代码,而不是其他存在其他问题的代码。请参考SSCCE了解在这些网站上发布最佳内容。 - Jon Egerton

2
现在它正在工作。我做了以下更改:-
而不是
[WebMethod(enableSession:true)] 

我放置

[WebMethod(EnableSession = true)]

但是两种方法都是正确的。

在我的ajax调用中,我包括了async: false。(我认为在设置会话之前它试图读取它)


1
这段代码对我来说很好用。
protected void Button1_Click(object sender, EventArgs e)
    {
        Session["MailId"] = "somemail@address.com";
        Response.Redirect("Handler.ashx");
    }

/// 在 ashx 中的代码

public class Handler : IHttpHandler, IRequiresSessionState
{

    public void ProcessRequest (HttpContext context)
    {

        string sessionValue = context.Session["MailId"].ToString();
        context.Response.Write(sessionValue);
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

我想知道您是否从ajax调用中访问处理程序


他已经在使用 IRequiresSessionState,这将完成任务(并允许读写访问会话)。 - Jon Egerton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接