我正在将 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中访问response cookies的接口是这样的:
基于此接口,我看不到一种方法来检查响应 cookie 是否存在并获取其属性。但一定有什么办法可以做到吗?
在操作方法中,我尝试在响应对象上设置两个 cookie,然后立即尝试访问它们。但智能感知没有显示任何允许我访问它们的方法、属性或索引器:
有一瞬间,我想也许我可以使用Response.Cookies.ToString();
只需解析该信息即可找到我的 cookie 信息,但是唉,ToString()
调用返回“Microsoft.AspNet.Http.Internal.ResponseCookies”,因为该对象不会覆盖默认实现。
只是为了好玩,我还检查了 GitHub 当前的开发分支,看看自 RC1 以来接口是否发生了变化,但它没有。那么给定这个接口,我如何检查响应 cookie 是否存在并获取它的属性?我曾考虑过尝试通过响应标头集合进行侵入,但这似乎很蹩脚。
有一个扩展方法可用Microsoft.AspNetCore.Http.Extensions
called 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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)