asp.net-core-mvc - 如何检查 Asp.net Core MVC(又名 Asp.Net 5 RC1)中的响应 cookie?

标签 asp.net-core-mvc

我正在将 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的接口(interface)是这样的:

response cookies interface

基于此接口(interface),我没有找到一种方法来检查响应 cookie 是否存在并获取其属性。但一定有什么办法可以做到吗?

在一个操作方法中,我尝试在响应对象上设置两个 cookie,然后立即尝试访问它们。但智能感知没有显示任何允许我访问它们的方法、属性或索引器:

enter image description here

有一瞬间,我想也许我可以使用 Response.Cookies.ToString();只需解析信息即可找到我的 cookie 信息,但是可惜的是 ToString()调用返回“Microsoft.AspNet.Http.Internal.ResponseCookies”,因为该对象不会覆盖默认实现。

只是为了好玩,我还检查了 GitHub 当前的开发分支,看看自 RC1 以来界面是否发生了变化,但它没有。那么给定这个接口(interface),我如何检查响应 cookie 是否存在并获取它的属性?我曾考虑过尝试通过响应 header 集合进行侵入,但这似乎很蹩脚。

最佳答案

Microsoft.AspNetCore.Http.Extensions中有一个可用的扩展方法叫GetTypedHeaders() 。可以调用 HttpContext.Response阅读Set-Cookie header 。例如,在中间件中,我们可能想拦截 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);
        }

关于asp.net-core-mvc - 如何检查 Asp.net Core MVC(又名 Asp.Net 5 RC1)中的响应 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36899875/

相关文章:

cookies - 如何在.net core中读取cookie过期时间?

asp.net-core - 每个记录器针对不同的提供者

c# - 在 Controller 外使用 HttpContext

asp.net - .NET Core IoC RegisterAssemblyTypes等效项

jquery - 如何使用 JQuery 将文件上传到 MVC VNext 网络服务器?

c# - Asp.Net 5 Mvc 6 依赖注入(inject) : Register for Session

asp.net-core-mvc - ASP.NET MVC6 Beta 8 和 Windows 身份验证

c# - app.UseRouting() 和 app.UseEndPoints() 有什么区别?

asp.net-core - 替换 appSettings.json 中的 .Net Core 变量以引用其他配置值

c# - ASP.NET 5 MVC 6 DI : ServiceProvider not resolving type