7

NRE

VS 2012 が Type 変数を NullReferenceException として表示するのはなぜですかvalue = "Retailer"

ここに画像の説明を入力

私は新生児を抱えており、限られた睡眠に取り組んでいるので、ここに明らかな何かが欠けている場合は申し訳ありません. LoggedInUser.Employer オブジェクトはインスタンス化されており、この行は 1/2 の時間で正常に機能します。しかし、それは壊れ始めます。これが役立つかどうかわからない - 睡眠が必要です...

 private string _type;
    public string Type
    {
        get { return _type; }
        set
        {
            if (value != null)
            {
                TypeEnum = (Constants.BusinessType)Enum.Parse(typeof(Constants.BusinessType), value, true);
                _type = value;
            }
        }
    }

ここに画像の説明を入力 クロススレッドの問題かどうか疑問に思っています...

ここに画像の説明を入力

4

3 に答える 3

2

ExecutionContextインスタンスの格納を担当するASP.NETは、HttpContext.Current他のスレッドに自然に「流れる」ことはありません。エラースタックトレースから判断すると、ASP.NET MVCで作業しています。これは、の使用を抽象化するフレームワークですHttpContext。あなたはおそらく、直接使用するのが一般的なWebFormsのバックグラウンドから来たのでしょうか。

同期コンテキスト

この記事は、私が合理的に説明できるよりもはるかに詳細な情報を提供します。ただし、状況に最も関連するポイントのいくつかは次のとおりです。

「ExecutionContextはすべて「環境」情報に関するものです。つまり、現在の環境または実行している「コンテキスト」に関連するデータを格納します。」

この「周囲の」情報は...HttpContext.Currentおよびそのさまざまなプロパティ(を含むSession)です。

「これは、TLSがこれらの非同期ポイント間を「フロー」しないため、実行の詳細を制御するために依存するようになったこのアンビエントコンテキストが実行できなくなったことを意味します。」

TLSはthread-local-storage(HttpContext.Currentなど)です。要するに、async=は潜在的に失われHttpContext.Currentます。

MVCの方法

MVCはほとんど抽象化されていると言ったことを覚えていHttpContextますか?

SessionController.Sessionにあります。(申し訳ありませんが、非同期コントローラーアクションでこれをテストしていないため、まだニーズに適しているかどうか、または連携させるために追加の作業が必要かどうかを確認できません。)

RequestController.Requestにあります

UserController.Userにあります

他にもあります...それらをチェックしてください

セッションの選択肢?

代替案を検討しましたか?Session +ASP.NETMVCが悪い考えであることを示唆する記事を見つけるために遠くを見る必要はありません。「悪いこと」であるかどうかという一般的なことを検討するつもりはありませんが、あなたの例を見ると、「セッション」データではなく、ユーザープロファイルデータを扱っているように見えます。

セッションは、ユーザープロファイル情報をキャッシュするのに実際には適切な場所ではありません。さらに言えば、それをキャッシュするのは適切ですか?セッション中にユーザープロファイルを変更できますか?彼らが自分で変更した場合、セッションをリセットしますか?別の管理者ユーザーがログイン中にプロファイルを変更した場合はどうなりますか?

代替案を探すことはこの質問の範囲を超えていますが、ここで間違った問題を解決しようとしている可能性があることに注意してください。

于 2013-02-19T21:23:58.443 に答える
1

String.IsNullOrEmpty は、文字列が null であっても、この例外をスローしないため、Type プロパティは問題になりません。LoggedInUser はエラーなしで 2 行前に使用されるため、Employer プロパティが原因になります (String が組み込みの String でない場合を除きます)。

null のチェックを追加して確認できます。

if (LoggedInUser.Employer != null) 
{
    if (String.IsNullOrEmpty(LoggedInUser.Employer.Type))
    {
        ...  
    }
}
else
{
    // debug output
}

Employer が null であると仮定すると、ここでそのプロパティ定義を提供する必要があります。これは複数のユーザーがログインしている場合にのみ表示されるため、静的宣言を行うべきではない場所にあると思われます。

于 2013-02-18T20:29:00.473 に答える
0

私の推測では、「String」という名前のフィールドをどこかで宣言したと思います-小文字の「string.IsNullOrEmpty」または「System.String.IsNullOrEmpty」を使用してみてください....

于 2013-02-18T20:03:09.357 に答える