如何读取响应 cookie

How to read response cookies

ASP.NET 5 MVC 应用程序方法设置 HttpContext.Response cookie。 如何在同一请求中通过长调用链从控制器调用的其他方法中读取此 cookie 值?

响应收集接口中不存在该方法

public interface IResponseCookies
{
    void Append(string key, string value);
    void Append(string key, string value, CookieOptions options);
    void Delete(string key);
    void Delete(string key, CookieOptions options);
}

当前请求的TempData值设置在其他方法中可以读取。为什么 cookie 不能? HttpContext.Items 中的 cookie 设置应该重复还是有更好的方法?

背景:

购物车应用程序具有从控制器调用的日志方法。

它必须记录 cartid

如果用户第一次将产品添加到购物车,控制器会使用新的 guid 创建购物车 ID,并将 cartid cookie 添加到响应中。

logger 方法使用 Request.Cookies["cartid"] 来记录购物车。

对于添加到购物车的第一件商品,它 return 为空,因为浏览器未设置 cookie。

Response.Cookies["cartid"]

不存在。

Log 方法可以从很多地方调用。很难将 cartid 作为参数传递给它。

应用程序具有从控制器调用的日志方法。它将控制器上下文记录到控制器使用的同一数据库中。

在使用 ASP.NET 核心应用程序模板创建的错误控制器中执行日志记录:

public async Task<IActionResult> Error()
{
    var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
    await logger.LogExceptionPage(exceptionHandlerPathFeature);
    HttpContext.Response.StatusCode = 500;
    return new ContentResult() {
        Content ="error"
    };
}

如何通过错误前执行的代码在此方法中记录响应 cookie?

导致编译错误的代码:

public class CartController : ControllerBase
{
    const string cartid = "cartid";
    private readonly HttpContextAccessor ca;

    public CartController(HttpContextAccessor ca)
    {
        this.ca = ca;
    }

    public IActionResult AddToCartTest(int quantity, string product)
    {
        ca.HttpContext.Response.Cookies.Append(cartid, Guid.NewGuid().ToString());
        Log("AddToCartStarted");
        return View();
    }

    void Log(string activity)
    {
        Console.WriteLine($"{activity} in cart {ca.HttpContext.Response.Cookies[cartid]}");
    }
}

您无法从 Response 中读取 Cookie。您需要按照以下方式从请求中读取它

ca.HttpContext.Request.Cookies[cartId];

cartId 是存储在 Cookie 中的值的键。