Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么HttpContext.Current.Session[";value";].ToString()在应用程序代码类文件中提供空值,对象引用未设置为对象的实例_C#_Asp.net_Session - Fatal编程技术网

C# 为什么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;

这里的场景是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;
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(); 
}