2011-02-08 14 views
3
if (HttpContext.Current.Request.Cookies.AllKeys.Contains("myCookie") && 
    !String.IsNullOrEmpty(HttpContext.Current.Request.Cookies["myCookie"].Value)) 
{ 
    HttpCookie myCookie = HttpContext.Current.Request.Cookies["myCookie"]; 
} 

このコードには何か問題がありますか?毎回、私たちのプロダクションウェブサイトは、ライン4でヌル参照例外を取得します。これはテストでは再現できません。HttpContext Cookie

答えて

9

最初の行ではなく、4行目で例外が発生していますか? 1つの例外を除いて、コードは正常に見えます。HttpContext.Currentが時々nullになります。これは、コードの最初の行で例外を引き起こすはずです。

これは、要求が実行されているスレッドとは異なるバックグラウンドスレッドの内部でコードを実行している場合に最もよく見られます。たとえば、スレッドを自分で作成した場合、またはBeginXXX非同期メソッド呼び出しに渡されたコールバックでコードを実行した場合は、NULLがHttpContext.Currentになります。

これは、要求が現在実行されているスレッドにHttpContext.Currentが関連付けられているために発生します。別のスレッドでは、フレームワークは使用したい要求を知る方法がありません。

これを修正する方法があります。たとえば、.NETのBackgroundWorkerは別のスレッドにコンテキストを伝播できます。 ASP.NETの非同期ページのサポートは、コンテキストを正しく伝播します。

だから、2つのオプションがあります。BackgroundWorkerまたは非同期ページのようなコンテキストパッシング非同期メカニズムを使用するために、すべての非同期コードを書き換える、またはHttpContext.Currentのいずれかのプロパティにアクセスしようとする前にHttpContext.Current==nullをチェックするようにコードを変更するのいずれかを。

+0

はい、例外をスローする行4です。 – harmony