0

応答オブジェクトにCookieがすでに存在するかどうかを確認するnullチェックインコードがあります。

         if (HttpContext.Current.Response.Cookies["CookieName"] != null)
        {
            sessionCookie = HttpContext.Current.Response.Cookies["CookieName"];
            cookieValue = sessionCookie.Value;
        }

デバッガーでチェックすると、チェック前にはキーが存在しませんが、チェック後には存在します。したがって、Cookieからの戻り値はnullです。Cookieの存在を確認すると、Cookieが自動的に作成されますか?

前もって感謝します

4

3 に答える 3

1

答えは「はい」です。どのような方法で呼び出しResponse.Cookies["CookieName"]ても、実際にCookieが作成されます。

于 2012-12-06T05:31:05.253 に答える
1

その場合、最初の回答に質問に関係のないナンセンスが含まれている場合。

チェックを行うたびに:

if (HttpContext.Current.Response.Cookies["CookieName"] != null)

このコード行は、Cookieが存在するかどうかを確認するだけでなく、新しい空のCookieを作成します。メソッドでさえ、暗黙的に新しいCookieGetを作成します[ 1 ] 。

次のようなコードを使用できます。

Cookie existing_cookie = null;
foreach (Cookie c in HttpContext.Current.Response.Cookies)
{
    if ("CookieName" == c.Name)
    {
        existing_cookie = c;
        break;
    }
}
if (null != existing_cookie)
{
    // exists
}

または、LINQメソッドを使用してほぼ同じことを行います。

于 2015-08-28T05:45:13.073 に答える
-1

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

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

したがって、2つのオプションがあります。BackgroundWorkerやAsync Pagesなどのコンテキストを渡す非同期メカニズムを使用するようにすべての非同期コードを書き直すか、HttpContext.Currentのプロパティにアクセスする前にHttpContext.Current==nullをチェックするようにコードを変更します。

于 2012-02-13T19:33:26.350 に答える