Метод приложения 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]}");
}
}