Stack Overflowのクイック検索から、Cookieが存在するかどうかを確認する次の方法を提案する人々を見ました:
HttpContext.Current.Response.Cookies["cookie_name"] != null
または(Page
クラス内):
this.Response.Cookies["cookie_name"] != null
ただし、インデクサー(またはCookies.Getメソッド)を使用して存在しないCookieを取得しようとすると、実際にはcreateその名前の「デフォルト」Cookieであり、それを返すようです。使用するCookie名に関係なく、nullを返すことはありません。 (さらに悪いことに、不要なCookieを作成します)
ここで何か間違ったことをしていますか、それとも名前で特定のCookieの存在を単純に確認する別の方法がありますか?
_Response.Cookies
_には、ブラウザーに送り返されるCookieが含まれます。 Cookieが存在するかどうかを知りたい場合は、おそらく_Request.Cookies
_を調べる必要があります。
とにかく、Cookieが存在するかどうかを確認するには、 Cookies.Get(string)
を確認します。 ただし、Responseオブジェクトでこのメソッドを使用し、Cookieが存在しない場合、そのCookieが作成されます。
_HttpCookieCollection.Get
_ Method(String) のMSDNリファレンスを参照してください
CookieがResponseに存在するかどうかをまだ知る必要がある場合があります。次に、Cookieキーが存在するかどうかを確認できます。
HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")
詳細は こちら をご覧ください。
私の場合、Global.asaxのApplication_EndRequestメソッドで応答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
}
あなたが達成しようとしていることに応じて、ここには多くの正解があります。包括的な答えを提供しようとする私の試みは次のとおりです。
Request
およびResponse
オブジェクトの両方には、Cookies
プロパティであるHttpCookieCollection
オブジェクトが含まれます。
Request.Cookies:
null
値を受け取ります。Response.Cookies:
Request.Cookies
コレクションに存在する場合、追加されます(ただし、Request.Cookies
オブジェクトに既にCookieが含まれている場合)同じキーで、値が古い場合でも、Response.Cookies
コレクションに新しく作成されたCookieからの変更を反映するために更新されません。ソリューション
クライアントからの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")
( here を参照)サーバーによって追加されたCookieを確認しようとしています現在のリクエスト中これらのメソッドのいずれかによって...
Response.Cookies["COOKIE_KEY"] != null
Response.Cookies.Get("COOKIE_KEY") != null
( here を参照)...Response.Cookies
コレクションにCookieが作成され、状態はtrue
と評価されます。
HttpContext.Current.Request.Cookies
ではなく、Response.Cookies
を使用する必要があります。
サイドノート:CookieはResponse.Cookies.Add
のリクエストにコピーされ、新しく追加されたCookieに対して同じ動作をするかどうかをチェックします。ただし、着信CookieがResponse
に反映されることはありません。
この動作は HttpResponse.Cookies propertyで文書化されています:
HttpResponse.Cookiesコレクションを使用してCookieを追加すると、応答がクライアントに送信されていなくても、CookieはHttpRequest.Cookiesコレクションですぐに使用可能になります。
public static class CookieHelper
{
/// <summary>
/// Checks whether a cookie exists.
/// </summary>
/// <param name="cookieCollection">A CookieCollection, such as Response.Cookies.</param>
/// <param name="name">The cookie name to delete.</param>
/// <returns>A bool indicating whether a cookie exists.</returns>
public static bool Exists(this HttpCookieCollection cookieCollection, string name)
{
if (cookieCollection == null)
{
throw new ArgumentNullException("cookieCollection");
}
return cookieCollection[name] != null;
}
}
使用法:
Request.Cookies.Exists("MyCookie")
申し訳ありませんが、コメントを追加するのに十分な担当者ではありませんが、zmbqの答えから:
とにかく、Cookieが存在するかどうかを確認するには、Cookies.Get(string)を確認します。これにより、Cookieコレクションは変更されません。
cookies.Get(string)は、まだ存在しない場合、実際にその名前でCookieを作成するため、完全に正しいとは限りません。ただし、彼が言ったように、Response.CookiesではなくRequest.Cookiesを見る必要があります。
bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;
Cookieの値を調べるには、次のようなことを実行できます。
Request.Cookies[SESSION_COOKIE_NAME].Value