静的メソッドでHttpContext.CurrentとNullReferenceException
-
19-09-2019 - |
質問
私はいくつかの静的メソッドと静的クラスを持っています。これらの方法では、私はHttpContext.Current
を使用して、現在のスレッドのコンテキストにアクセスしようとしています。たとえばます:
var userName = HttpContext.Current.User.Identity.Name;
しかし、私はそれを行うときに、私はNullReferenceException
、悪名高い受信「オブジェクトのインスタンスに設定されていないオブジェクト参照を。」
任意のアイデア?
解決
これはHttpContext
が実際に欠けているものであるオリジナルのポストから明らかではありません。 HttpContext.User
プロパティはまた、あなたとまったく同じ例外を与えることになる、ライフサイクルのある段階で、nullにすることができます。他のすべての問題はさておき、あなたがソースをステップ実行し、実際にnull
ある表現のどの部分を参照する必要があります。
HttpContext.Current
のような静的なメソッド/プロパティを参照するコードを記述する場合、、あなたはメソッド/プロパティは、実際に利用可能なとき、あなたのコードが実行されることが保証されていないことを知って、それらを記述する必要があります。通常は、このようなものを持っています:
static string GetCurrentUserName()
{
HttpContext context = HttpContext.Current;
if (context == null)
return null;
IPrincipal user = context.User;
if (user == null)
return null;
return user.Identity.Name;
}
私はこれは本当にここにあなたの問題を解決しないだろうと思われるが、それだけで例外を取り除くでしょう。問題は、あなたがそのようなバックグラウンドスレッド、静的コンストラクタまたはフィールド初期化子のように、コンテキストは、単に利用できない時間や場所でこのメソッドを呼び出す、またはApplication_BeginRequest
方法、またはいくつかの同様の場所にいる可能性が高いです。
I(すなわちコンストラクタで撮影)HttpContext
インスタンスに依存するクラスのインスタンスメソッドに静的メソッドを変更することによって始めるかもしれません。それはGetCurrentUserName
ような方法は、単純な「ユーティリティ」方法であることを考えることに自分自身をだますのは簡単だが、彼らは本当にないよ、それはあなたがいない任意の場所からの静的プロパティを使用して参照がHttpContext.Current
メソッドを呼び出すことが一般的に無効ですすでにのインスタンス(HttpContext
クラスからIE)同じPage
にの参照を持っています。あなたはこのようなあなたのクラスを書き換える起動した場合のオッズは、次のとおりです:
public class UserResolver
{
private HttpContext context;
public UserResolver(HttpContext context)
{
if (context == null)
throw new ArgumentNullException("context");
this.context = context;
}
public string GetUserName()
{
return (context.User != null) ? context.User.Identity.Name : null;
}
}
...その後、あなたはおそらくチェーンは、あなたが他の場所からそれを得ることができないので、あなたがHttpContext.Current
を参照する必要がその時点でされる、破壊される迅速ここで、の非常にのがわかりますます。
この特定のケースでは、明らかに、あなただけの連鎖が始まるとどこ/あなたは私が前述した変更を加える必要はありませんので、見つけるためにNullReferenceException
のスタックトレースを取ることによって、問題を解決することができます - 私は単純に将来的には「行方不明シングルトン」のエラーこれらの種類を減らすのに役立ちます一般的なアプローチを推奨しています。
他のヒント
私は特に私のメインのプロジェクト別のライブラリではなく、静的メソッドで、これに数回実行しました。私は他に何も動いていないようにみえのparamとして、静的メソッドにのHttpContextを渡すに頼ってきます。
どこ正確にはnull例外がスローされていますか?あなたがデバッグし、nullであるかを見ることがありますか? HttpContext.Currentがnullまたはユーザーですか?