Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
В отличие от ASP.NET MVC работа с куками в Web API немного отличается. На уровне протокола HTTP куки представляют порцию данных, которую сервер посылает
клиенту в ответе HTTP. Для установки куков сервер использует в ответе заголовок Set-Cookie
:
HTTP/1.1 200 OK Set-Cookie: id=54854789;
В Web API для создания куки применяется класс CookieHeaderValue из пространства имен System.Net.Http.Headers
:
public HttpResponseMessage GetBooks() { var cookie = new CookieHeaderValue("id", "12345"); // имя куки - id, значение - 12345 cookie.Expires = DateTimeOffset.Now.AddDays(1); // время действия куки - 1 день cookie.Domain = Request.RequestUri.Host; // домен куки cookie.Path = "/"; // путь куки var response = Request.CreateResponse<IEnumerable<Book>>(HttpStatusCode.OK, db.Books); response.Headers.AddCookies(new CookieHeaderValue[] { cookie }); return response; }
Конструктор класса CookieHeaderValue в качестве первого параметра принимает имя куки, а второй параметр указывает на значение. Так в данном случае сохраняется куки id со значением 12345.
Класс CookieHeaderValue также позволяет установить ряд дополнительных параметров с помощью свойств:
Expires: время действия куки, после истечения которого они уничтожаются
Domain: домен куки
Path: виртуальный путь для передачи с текущими куки
MaxAge: максимальный возраст ресурса
Secure: получает или задает значение, указывающее, используется ли для передачи куки протокол SSL, то есть протокол HTTPS
Для добавления куков в ответ применяется метод response.Headers.AddCookies(new CookieHeaderValue[] { cookie })
, который в качестве
параметра принимает набор передаваемых куков.
Теперь получим куки:
public IHttpActionResult GetBook(int id) { string Id = ""; CookieHeaderValue cookie = Request.Headers.GetCookies("id").FirstOrDefault(); if (cookie != null) { Id = cookie["id"].Value; } //...прочие операции }
При необходимости мы можем добавить в куки не только одно значение, но и набор значений.
public HttpResponseMessage GetBooks() { var vals = new NameValueCollection(); // using System.Collections.Specialized vals["pid"] = "12345"; vals["name"] = "bill"; var cookie = new CookieHeaderValue("person", vals); var response = Request.CreateResponse<IEnumerable<Book>>(HttpStatusCode.OK, db.Books); response.Headers.AddCookies(new CookieHeaderValue[] { cookie }); return response; }
Объект NameValueCollection из пространства имен System.Collections.Specialized
позволяет задать набор пар
ключ-значения, а в конструкторе CookieHeaderValue этот набор задается в качестве значения куки "person". Теперь получим куки:
public IHttpActionResult GetBook(int id) { string pid = ""; string name = ""; CookieHeaderValue cookie = Request.Headers.GetCookies("person").FirstOrDefault(); if (cookie != null) { CookieState cookieState = cookie["person"]; pid = cookieState["pid"]; name = cookieState["name"]; } //...прочие операции }
Класс CookieState предоставляет индексатор для доступа ко всем парам ключ-значение, которые хранятся в куках. Благодаря этому можно получить все сохраненные в куках значения.