4

いくつかの静的メソッドを持つ静的クラスがあります。これらのメソッドでは、を使用して現在のスレッドのコンテキストにアクセスしようとしていますHttpContext.Current。例えば:

var userName = HttpContext.Current.User.Identity.Name;

ただし、これを行うと、NullReferenceException悪名高い「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージが表示されます。

何か案は?

4

3 に答える 3

6

元の投稿から、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この問題は、バックグラウンドスレッド、静的コンストラクター、フィールド初期化子、メソッド、または同様の場所など、コンテキストが単に利用できない時間または場所でこのメソッドを呼び出している可能性が高くなります。

静的メソッドを、インスタンスに依存するクラスのインスタンスメソッドに変更することから始めるかもしれませんHttpContext(つまり、コンストラクターで取得されます)。のようなメソッドは単純な「ユーティリティ」メソッドであると思い込むのは簡単ですが、実際にはそうではありません。また、静的プロパティを介して参照するメソッドを、まだ持っていない場所からGetCurrentUserName呼び出すことは一般的に無効です。同じものへHttpContext.Currentインスタンス参照HttpContext(つまり、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てチェーンが開始する場所/タイミングを見つけるだけで問題を解決できるため、上記で説明した変更を行う必要はありません-私は単純です将来、この種の「シングルトンの欠落」エラーを減らすのに役立つ一般的なアプローチを推奨します。

于 2010-03-11T16:20:27.060 に答える
2

特に、メインプロジェクトではなく、別のライブラリの静的メソッドで、これに何度か遭遇しました。他に何も機能していないように見える場合は、HttpContextをparamとして静的メソッドに渡すことにしました。

于 2010-03-11T15:57:38.507 に答える
0

null例外がスローされるのは正確にはどこですか?デバッグして、nullが何であるかを確認しましたか?HttpContext.Currentはnullですか、それともユーザーですか?

于 2010-03-11T02:14:25.190 に答える