C# 为什么HttpContext.Current.Session[";value";].ToString()在应用程序代码类文件中提供空值,对象引用未设置为对象的实例
这里的场景是HttpContext.Current.Session[“value”]。ToString()提供空值,甚至在用户登录时已经设置了会话值 我的网络配置C# 为什么HttpContext.Current.Session[";value";].ToString()在应用程序代码类文件中提供空值,对象引用未设置为对象的实例,c#,asp.net,session,C#,Asp.net,Session,这里的场景是HttpContext.Current.Session[“value”]。ToString()提供空值,甚至在用户登录时已经设置了会话值 我的网络配置 <sessionState timeout="40" mode="InProc"/> 在我的Defaultpage.asppx.cs中 Emp_等级empgrd=新Emp_等级()提供未设置为对象实例的对象引用 using System.Data; using System.Linq; using System.Web;
<sessionState timeout="40" mode="InProc"/>
在我的Defaultpage.asppx.cs中
Emp_等级empgrd=新Emp_等级()代码>提供未设置为对象实例的对象引用
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.Configuration;
public partial class EmpGrade : System.Web.UI.Page
{
//here am getting error(The type initializer for 'Emp_grade' threw an exception)
// stack error message Object reference not set to an instance of an object.
Emp_grade empgrd = new Emp_grade();
protected void Page_Load(object sender, EventArgs e)
{
logic code...
Datatable dt= empgrd.EmpRecord();
}
}
在我的App\u code文件夹中
我有一个类文件Emp\u grade.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data.SqlClient;
using System.Web.Configuration;
using System.Web.SessionState;
public class Emp_grade
{
public Emp_grade()
{
//TODO: Add constructor logic here
}
static string getConnection = HttpContext.Current.Session["DomainName"].ToString();
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[getConnection].ConnectionString);
public DataTable EmpRecord()
{
logic code
}
}
我的登录页面:
protected void Page_Load(object sender, EventArgs e)
{
//set some value
Session["DomainName"] = domainname;
}
屏幕截图(调试)
您正在静态字段的构造函数中引用.Session[“DomainName”]
。它可能会在任何其他代码运行之前运行。它很可能会在任何HttpContext
之外运行,因为它很可能会在处理第一个请求之前,在初始化应用程序时运行
我怀疑将getConnection
设置为非静态会解决问题。您可能应该重构一点。这:
static string getConnection = HttpContext.Current.Session["DomainName"].ToString();
是带有初始值设定项的静态字段。它将运行一次,并保留它获得的任何值,直到应用程序重新启动。它将在一个没有很好定义的时间运行,只是保证它将在首次访问之前的某个时间运行
这意味着它可能在不存在HttpContext
的时候运行(比如Dan Puzeywrite),这将导致抛出异常。(据我所知)任何后续访问它的尝试都会导致抛出相同的异常
但是请记住,它只获取一次,因此即使初始化器成功地找到一个值,该值也将用于getConnection
的所有后续使用。不会为每个不同的用户重新获取它
要解决此问题,可以将其包装到实例方法中:
private string GetDomainName()
{
return HttpContext.Current.Session["DomainName"].ToString();
}
SqlConnection conn = null;
然后在构造函数中初始化conn
:
public Emp_grade()
{
conn = new SqlConnection(ConfigurationManager.ConnectionStrings[GetDomainName()].ConnectionString);
}
还请注意,由于此类正在初始化和存储SqlConnection
(即IDisposable
),因此您的类还应该实现IDisposable
接口。有关实现IDisposable
的背景信息,请参阅示例
EDIT:屏幕截图显示HttpContext.Current.Session
返回null
原因是这一行:
Emp_grade empgrd = new Emp_grade();
这是使用初始值设定项在Page类中声明实例成员。初始值设定项很早就在请求管道中运行,因此在它运行会话时,上下文中还不存在会话
改为:
Emp_grade empgrd = null;
protected void Page_Load(object sender, EventArgs e)
{
empgrd = new Emp_grade();
Datatable dt = empgrd.EmpRecord();
}
所以在为会话标记赋值后,您试图从该标记中获取该值?您的连接字符串有效吗?只有当我获取getConnection not null时,connectionstring才有效values@NewAmbition:是,我想检索该会话[“域名”]value@satindersingh将string domainName=Session[“domainName”].ToString()
不起作用?我还怀疑在Emp_grade的每个实例中创建SQL连接不是理想的解决方案。getConnection non static将修复此问题,并给出错误“字段初始值设定项无法引用非静态字段、方法或属性'Emp_grade.getConnection'”@satindersingh:那么,您应该将初始化移到构造函数。谢谢您的回复,但仍然是相同的错误System.NullReferenceException:对象引用未设置为对象的实例。在返回HttpContext.Current.Session[“DomainName”].ToString()代码>@satindersingh然后您必须找出该行中哪个对象为空。可能是HttpContext.Current
为null,或者HttpContext.Current.Session
为null,或者只是会话中没有具有键DomainName
的内容。要找出是哪一个,请在直线上放置一个断点,然后当遇到断点时,将鼠标依次悬停在每个断点上,然后查看工具提示显示的内容。同时检查调用堆栈以查看类的更新位置。请检查屏幕截图,更新我的问题,希望对您有所帮助
Emp_grade empgrd = null;
protected void Page_Load(object sender, EventArgs e)
{
empgrd = new Emp_grade();
Datatable dt = empgrd.EmpRecord();
}