Куки в Web API

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 29.10.2015

В отличие от 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 предоставляет индексатор для доступа ко всем парам ключ-значение, которые хранятся в куках. Благодаря этому можно получить все сохраненные в куках значения.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850