如何在 Asp.net Core MVC(又名 Asp.Net 5 RC1)中檢查響應 cookie?
我正在將 Web 表單應用程序轉換為 asp.net core mvc。在我的 web 表單應用程序中,有時在我設置了一些響應 cookie 之後,其他程式碼需要查看它們是否已設置,如果是,請訪問 cookie 的屬性(即值、過期、安全、http)。在 webforms 和 MVC 5 中,可以遍歷 cookie 並返回任何特定的 cookie(我知道的老派)
for(int i = 0; i < cookies.Count; i++) { if(cookies[i].Name == cookieName) { return cookies[i]; } }但是asp.net core mvc中訪問響應cookie的界面是這樣的:
基於此界面,我看不到一種方法來檢查響應 cookie 是否存在並獲取它的屬性。但是一定有辦法做到嗎?
在一個操作方法中,我嘗試在響應對像上設置兩個 cookie,然後立即嘗試訪問它們。但是智能感知沒有顯示任何允許我訪問它們的方法、屬性或索引器:
有那麼一刻,我想也許我可以使用
Response.Cookies.ToString();並解析這些資訊來查找我的 cookie 資訊,但是可惜,該ToString()呼叫返回“Microsoft.AspNet.Http.Internal.ResponseCookies”,因為該對像沒有覆蓋預設實現。只是為了好玩,我還檢查了 GitHub 的目前 dev 分支,看看界面自 RC1 以來是否發生了變化,但實際上沒有。那麼給定這個介面,我如何檢查響應cookie的存在並獲取它的屬性?我曾想過嘗試通過響應標頭集合進行入侵,但這似乎很蹩腳。
這是我
value從響應中獲取 cookie 的方法。如果需要,可以使用這樣的東西來獲取整個 cookie:string GetCookieValueFromResponse(HttpResponse response, string cookieName) { foreach (var headers in response.Headers.Values) foreach (var header in headers) if (header.StartsWith($"{cookieName}=")) { var p1 = header.IndexOf('='); var p2 = header.IndexOf(';'); return header.Substring(p1 + 1, p2 - p1 - 1); } return null; }
Microsoft.AspNetCore.Http.Extensions在被呼叫中有一個擴展方法可用GetTypedHeaders()。可以呼叫它HttpContext.Response來讀取Set-Cookie標題。例如在中間件中,我們可能想要截取Set-Cookie響應頭並替換它:public async Task Invoke(HttpContext httpContext) { httpContext.Response.OnStarting(state => { var context = (HttpContext)state; var setCookieHeaders = context.Response.GetTypedHeaders().SetCookie; // We assume only one cookie is found. You could loop over multiple matches instead. // setCookieHeaders may be null if response doesn't contain set-cookie headers var cookie = setCookieHeaders?.FirstOrDefault(x => x.Name == "mycookiename"); if (cookie == null) { return Task.CompletedTask; } var opts = new CookieOptions { HttpOnly = true, Expires = DateTimeOffset.Now.AddHours(12), SameSite = SameSiteMode.Lax, Secure = true }; context.Response.Cookies.Delete(cookie.Name.Value); context.Response.Cookies.Append(cookie.Name.Value, "mynewcookievalue", opts); return Task.CompletedTask; }, httpContext); await _next(httpContext); }

