1

ここでのシナリオは HttpContext.Current.Session["value"].ToString() で、ユーザーのログイン時にすでにセッション値が設定されていても、null 値を返します。

私のウェブ設定

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

私のglobal.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(); 

初期化子を持つ静的フィールドです。一度実行され、アプリケーションが再起動されるまで取得した値を保持します。そして、それはあまり明確に定義されていない時間に実行されます。最初にアクセスされる前に実行されることが保証されているだけです。

これは、例外がスローされる原因となる( Dan PuzeyHttpContextが書いたように) no が存在するときにも実行される可能性があることを意味します。それ以降にアクセスしようとすると、(私の知る限り)同じ例外がスローされます。

ただし、一度しか取得されないことに注意してください。そのため、イニシャライザが成功して値を見つけたとしても、その値はその後のすべての の使用に使用されます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(); 
} 
于 2012-08-16T10:47:08.393 に答える
1

.Session["DomainName"]静的フィールドのコンストラクターで参照しています。これは、他のコードよりも先に実行される可能性があります。HttpContext最初のリクエストが処理される前に、初期化されたアプリケーションとして実行される可能性があるため、まったく外部で実行される可能性があります。

getConnection非静的にすることで問題が解決すると思います。

于 2012-08-16T10:16:15.830 に答える