foreachループでRequest.CookiesがHttpCookieオブジェクトの代わりに文字列を返すのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1021183

  •  06-07-2019
  •  | 
  •  

質問

今朝、誤って次のスニペットコードを見ましたが、非常にうまく機能するのでかなり驚きました。

ロジックを見てはいけません。なぜHttpCookieCollection(この場合はRequest.Cookies)がforeachループでHttpCookieオブジェクトの代わりに文字列(Cookie名)を返すのか不思議です。通常、このコレクションでHttpCookieオブジェクトをインデックス/名前で取得するため、一貫性の問題ですか?

ありがとう、

foreach (string cookieKey in System.Web.HttpContext.Current.Request.Cookies)
{
    HttpCookie tmpCookie = System.Web.HttpContext.Current.Request.Cookies[cookieKey];
    if (tmpCookie != null && tmpCookie["RecentlyVisited"] != null)
    {
       cookie.Add(tmpCookie);
    }
}
役に立ちましたか?

解決

キーでコレクションを反復処理する方が理にかなっています。そうすれば、両方のキーにアクセスでき、 System.Web.HttpContext.Current.Request.Cookies [cookieKey];

を呼び出すことで値に簡単にアクセスできます。

他のヒント

インデックスでCookieをループすることができます:

HttpCookieCollection MyCookieColl;
HttpCookie MyCookie;

MyCookieColl = Request.Cookies;

// Capture all cookie names into a string array.
String[] arr1 = MyCookieColl.AllKeys;

// Grab individual cookie objects by cookie name.
for (int i = 0; i < arr1.Length; i++) 
{
   MyCookie = MyCookieColl[arr1[i]];
   Debug.WriteLine("Cookie: " + MyCookie.Name);
   Debug.WriteLine("Expires: " + MyCookie.Expires);
   Debug.WriteLine("Secure:" + MyCookie.Secure);
}

Cookieは数値インデックスでも取得できるため、CookieCollectionなどにコピーしなくても、同じ名前の複数のCookieを実際にスキャンできます。

これでうまくいくはずです:

var cookieName = "yourcookie";
var matches = cookies.AllKeys
    .Select((name, i) => new {name, i})
    .Where(x => x.name == cookieName)
    .Select(x => DoSomethingWithEachMatch(cookies[x.i]));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top