55

Stack Overflowで簡単に検索したところ、Cookie が存在するかどうかを確認する次の方法を提案している人々を見ました。

HttpContext.Current.Response.Cookies["cookie_name"] != null

または(Pageクラス内):

this.Response.Cookies["cookie_name"] != null

ただし、インデクサー (または Cookies.Get メソッド) を使用して存在しない Cookie を取得しようとすると、実際にはその名前の「デフォルト」Cookie を作成して返すように見えるため、使用する Cookie 名に関係なくnull を返すことはありません。(さらに悪いことに、不要な Cookie を作成します)

ここで何か間違ったことをしていますか、それとも特定の Cookie の存在を名前で単純に確認する別の方法がありますか?

4

7 に答える 7

61

Cookie が Response に存在するかどうかを知る必要がある場合があります。次に、Cookie キーが存在するかどうかを確認できます。

HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")

詳細については、こちらをご覧ください

私の場合、Global.asax の Application_EndRequest メソッドで Response Cookie を変更する必要がありました。Cookie が存在しない場合は、触れません。

string name = "myCookie";
HttpContext context = ((HttpApplication)sender).Context;
HttpCookie cookie = null;

if (context.Response.Cookies.AllKeys.Contains(name))
{
    cookie = context.Response.Cookies[name];
}

if (cookie != null)
{
    // update response cookie
}
于 2012-11-07T14:59:02.813 に答える
53

達成しようとしていることに応じて、ここには多くの正しい答えがあります。包括的な答えを提供するための私の試みは次のとおりです。

Requestとオブジェクトの両方に、オブジェクトであるプロパティがResponse含まれています。CookiesHttpCookieCollection

Request.Cookies:

  • このコレクションには、クライアントから受け取った Cookie が含まれています
  • このコレクションは読み取り専用です
  • このコレクションから存在しない Cookie にアクセスしようとすると、null値が返されます。

Response.Cookies:

  • このコレクションには、現在のリクエスト中にサーバーによって追加された Cookie のみが含まれます。
  • このコレクションは書き込み可能です
  • このコレクションから存在しない Cookie にアクセスしようとすると、新しい Cookie オブジェクトを受け取ります。アクセスしようとした Cookie がコレクションに存在しない場合は、追加されます (ただし、オブジェクトに同じキーを持つ Cookie が既に含まれている場合、その値が古くなっている場合でも、変更を反映するように更新されることはありません)。コレクション内の新しく作成された Cookie から。Request.CookiesRequest.CookiesResponse.Cookies

ソリューション


クライアントからの Cookie の存在を確認する場合は、次のいずれかを実行します。

  • Request.Cookies["COOKIE_KEY"] != null
  • Request.Cookies.Get("COOKIE_KEY") != null
  • Request.Cookies.AllKeys.Contains("COOKIE_KEY")

現在のリクエスト中にサーバーによって追加された Cookie の存在を確認するには、次の手順を実行します。

  • Response.Cookies.AllKeys.Contains("COOKIE_KEY")(こちらをご覧ください

これらのメソッドのいずれかによって、現在のリクエスト中にサーバーによって追加された Cookie を確認しようとしています...

  • Response.Cookies["COOKIE_KEY"] != null
  • Response.Cookies.Get("COOKIE_KEY") != null(こちらをご覧ください

Response.Cookies...コレクション内に Cookie が作成され、状態が に評価されtrueます。

于 2015-05-13T18:54:53.577 に答える
42

Response.Cookiesブラウザに送り返される Cookie が含まれています。Cookie が存在するかどうかを知りたい場合は、おそらく を調べる必要がありますRequest.Cookies

とにかく、Cookie が存在するかどうかを確認するには、Cookies.Get(string). ただし、このメソッドを Response オブジェクトで使用し、Cookieが存在しない場合は、その Cookie が作成されます。

メソッド (文字列)の MSDN リファレンスを参照してください。HttpCookieCollection.Get

于 2012-10-24T22:10:57.050 に答える
36

HttpContext.Current.Request.Cookiesではなく、を使用する必要がありますResponse.Cookies

補足: Cookie は Request on にコピーされResponse.Cookies.Add、新しく追加された Cookie に対して同じように動作するようにいずれかをチェックします。ただし、受信した Cookie は に反映されませんResponse

この動作は、HttpResponse.Cookiesプロパティに記載されています。

HttpResponse.Cookies コレクションを使用して Cookie を追加すると、応答がクライアントに送信されていない場合でも、Cookie は HttpRequest.Cookies コレクションですぐに使用できるようになります。

于 2012-10-24T22:11:40.303 に答える
2

申し訳ありませんが、コメントを追加するのに十分な担当者ではありませんが、zmbq の回答から:

とにかく、Cookie が存在するかどうかを確認するには、Cookies.Get(string) を確認できます。これは Cookie コレクションを変更しません。

Cookies.Get(string) は、まだ存在しない場合、その名前の Cookie を実際に作成するため、完全には正しくない可能性があります。ただし、彼が言ったように、Response.Cookies ではなく、Request.Cookies を見る必要があります。

bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;
于 2013-01-09T06:12:11.770 に答える
0

Cookie の値を調べるには、次のようにします。

Request.Cookies[SESSION_COOKIE_NAME].Value
于 2014-10-29T14:24:16.967 に答える