1

这里的场景是 HttpContext.Current.Session["value"].ToString() 给出空值,甚至在用户登录时已经设置了会话值。

我的网络配置

<sessionState timeout="40" mode="InProc"/>

我的全球.asax

   void Session_Start(object sender, EventArgs e) 
    {
       // Code that runs when a new session is started
       Session["EmployeeId"] = "";
       this.Session["DomainName"] = "";
    }

在我的 Defaultpage.asppx.cs

Emp_grade empgrd = new Emp_grade();给出未设置为对象实例的对象引用

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_Code folder我有类文件Emp_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;
    }

截图(调试) 在此处输入图像描述

4

2 回答 2

2

您可能应该重构一下。这:

static string getConnection = HttpContext.Current.Session["DomainName"].ToString(); 

是一个带有初始化器的静态字段。它将运行一次,并保留它获得的任何值,直到应用程序重新启动。并且它会在没有很好定义的时间运行,只是保证它会在第一次访问之前的某个时间运行。

这意味着它很可能在不HttpContext存在的时候运行(如Dan Puzey所写),这将导致抛出异常。任何后续访问它的尝试都会(据我所知)导致抛出相同的异常。

但请记住,它只获取一次,因此即使初始化程序成功并找到了一个值,该值也将用于getConnection. 不会为每个不同的用户重新获取它。

为了解决这个问题,你可以将它包装在一个实例方法中:

private string GetDomainName()
{
    return HttpContext.Current.Session["DomainName"].ToString();
}
SqlConnection conn = null;

然后conn在构造函数中初始化:

public Emp_grade()         
{         
    conn = new SqlConnection(ConfigurationManager.ConnectionStrings[GetDomainName()].ConnectionString);
}

另请注意,由于此类正在初始化和存储 a SqlConnection(即IDisposable),因此您的类还应实现该IDisposable接口。有关实施的背景信息IDisposable,请参见例如此答案

编辑:屏幕截图显示HttpContext.Current.Session返回 null。

原因是这一行:

Emp_grade empgrd = new Emp_grade();

这是在 Page 类中声明一个带有初始化程序的实例成员。初始化程序在请求管道中很早就运行,因此在它运行时 Session 还没有出现在上下文中。

改成:

Emp_grade empgrd = null;

protected void Page_Load(object sender, EventArgs e) 
{ 
  empgrd = new Emp_grade();
  Datatable dt = empgrd.EmpRecord(); 
} 
于 2012-08-16T10:47:08.393 回答
1

.Session["DomainName"]在构造函数中引用静态字段。这可能会在您的任何其他代码之前运行。它很可能会在任何外部运行HttpContext,因为它很可能会在应用程序初始化时运行,在第一个请求被处理之前。

我怀疑制作getConnection非静态会解决问题。

于 2012-08-16T10:16:15.830 回答