关于C#:Session在ASP.NET中返回空对象

session returns null object in asp.net

我正在开发asp.net Web应用程序,其中使用Session来存储与用户相关的数据。尽管我在尝试检索数据时将其存储在会话对象中却给了我错误:

Object reference not set to an instance of an object.

设置会话变量

aspx页面(myfile.aspx.cs)后面代码中的某处

1
HttpContext.Current.Session["ProjectID"] = Request.QueryString["Pid"].ToString();

检索会话变量

常规业务逻辑C#类(Someclass.cs)

1
sProjectID = HttpContext.Current.Session["ProjectID"].ToString();

它在上面的行给我错误。 在我看来很奇怪。 有人可以解释吗?

编辑:

通过通用处理程序(.ashx)页面调用类


如果确实是您所显示的代码行产生了异常,则意味着您的"常规业务逻辑"正在非HttpRequest处理线程中运行,其中诸如Context和Session之类的东西不可用。检查HttpContext.CurrentHttpContext.Current.Session是否不为空。

更新:

看到您的编辑后-要访问Session,您的处理程序必须在其类声明中包含IRequiresSessionState。请参阅:HttpContext.Current.Session在Ashx文件中为null。


在调试模式下,您无法在会话中找到任何值。将其分配给诸如字符串之类的引用变量,并确定其是否返回值。

并为良好作法,在分配给任何对象之前,请检查会话变量是否为null。


尝试通过以下方式设置Cookie:

1
2
3
HttpCookie cookie = HttpContext.Current.Request.QueryString["Pid"].ToString();
cookie.Expires = DateTime.Now.AddDays(7); // Set the expiration duration
HttpContext.Current.Response.Cookies.Set(cookie); // Set it to the response

并尝试以这种方式在下一个请求中获取Cookie:

1
string value = HttpContext.Current.Request.Cookies["Pid"] != null ? this.Page.Request.Cookies["Pid"].ToString() : null; // load it from request

老实说,您根本不应该尝试从业务逻辑中接收cookie,因为它与您的网站无关。相反,您应该将Cookie加载到UI(网络)中,并将该值作为参数传递给业务逻辑中Someclass.cs的任何函数或属性。

看一下N层模型,这是这样做的原因。


您能否到达设置会话值的调试模式行?如果您可以尝试点击后一行并通过键" ProjectID"检查会话中的值。