Как прочитать ответные куки

Метод приложения ASP.NET 5 MVC устанавливает файл cookie HttpContext.Response. Как прочитать это значение 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 или есть лучший метод?

Предыстория:

Приложение корзины покупок имеет метод журнала, вызываемый из контроллеров.

Он должен войти в картид

Если пользователь впервые добавляет продукт в корзину, контроллер создает идентификатор корзины, используя новый guid, и добавляет файл cookie carid в ответ.

Метод logger использует Request.Cookies["cartid"] для записи в корзину.

Для первого элемента, добавленного в корзину, возвращается значение null, поскольку файл cookie не установлен для браузера.

Response.Cookies["cartid"]

не существует.

Метод журнала может вызываться из многих мест. Ему сложно передать в качестве параметра cartid.

Приложение имеет метод журнала, вызываемый из контроллеров. Он записывает контекст контроллера в ту же базу данных, которая используется контроллерами.

Ведение журнала выполняется в контроллере ошибок, созданном с использованием шаблона приложения ASP.NET Core:

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]}");
    }
}

person Andrus    schedule 22.04.2021    source источник
comment
Отвечает ли это на ваш вопрос? Как я могу проверить файл cookie ответа в Asp.net Core MVC (он же Asp.Net 5 RC1)?   -  person janw    schedule 02.05.2021


Ответы (1)


Вы не можете прочитать файлы cookie от Response. Вам нужно прочитать его из запроса следующим образом

ca.HttpContext.Request.Cookies[cartId];

cartId — это ключ для значения, хранящегося в Cookie.

person Mukesh    schedule 22.04.2021
comment
Если cookie создается во время обработки того же запроса, он не существует в запросе, и Request.Cookies["cartid"] возвращает null . Код в ответе не может использоваться для чтения файлов cookie, только что созданных и еще не отправленных в браузер. - person Andrus; 22.04.2021