NET и C#, Четене и писане на бисквитки

HTTP протоколът е без състояние, така че по принцип HTTP сървърите отговарят на всяка клиентска заявка, без да я обвързват с предишни или следващи заявки. За да поддържате състояние между клиента и сървъра, трябва програмно да следите сесията на потребителя, улавяйки информация за това до какви ресурси има достъп потребителят и какви данни въвежда. Проследяването на сесия ви позволява да поддържате връзка между две последователни заявки, направени към сървър в Интернет.

Има различни начини за поддържане на състоянието по време на сесия, като бисквитки, които са най-често срещаните средства за поддържане на състоянието на приложението.

Бисквитките работят, като съхраняват идентификационни знаци на клиента. Това означава, че клиентът трябва да управлява генерираните бисквитки. Обикновено браузърът управлява всичко това (въпреки че някои потребители може да деактивират поддръжката им), но ако предното приложение на клиента не е браузър, тогава трябва сами да проследяваме заявките и да управляваме състоянието на сесията.

Всеки път, когато сървърът присвои бисквитка на заявка, клиентът трябва да я запази и да я изпрати обратно на сървъра със следващата си заявка. Обектите HttpWebRequest и HttpWebResponse предоставят контейнер за съхраняване на бисквитки, изпращането им и получаването им, но те не ги съхраняват автоматично, така че наша работа е да ги съхраним и изпратим на сървъра заедно със следващата заявка, която му предаваме.

За да управляваме бисквитките, ние използваме класаCookieCollection от пространството на имената System.Net. Този клас предоставя механизъм за обработка на множество бисквитки.

Писане на бисквитка на клиента

За да демонстрираме използването на бисквитки в .NET, нека изградим примерно приложение, което ще създава бисквитки итогава нека създадем тестова ASP.NET страница, за да проверим дали бисквитката е създадена.

Следният код използва обекта Cookie, за да зададе бисквитката MyName със стойността „Alex“ и да я изпрати на сървъра в HTTP заявка. Имайте предвид, че обектът Cookie е просто представяне на бисквитката в паметта - той не съхранява никакви данни на диска на клиента. Когато създаваме бисквитка, ние също задаваме пътя (URI на сървъра, до който ще бъде изпратена бисквитката) и името на домейна, за който бисквитката е валидна.

След като имаме бисквитка, можем да настроим нейното свойство Expires, за да показва кога изтича нейното времево ограничение (и спираме да я изпращаме до сървъра). С тези зададени свойства добавяме бисквитката към CookieContainer на заявката.CookieContainer е колекция от бисквитки, която ви позволява да съхранявате бисквитки за множество сайтове. Всяка бисквитка, добавена към CookieContainer, е включена във вътрешна колекция от всички бисквитки, свързани с определен URL адрес:

За да тестваме кода, нека създадем много проста ASP.NET страница с име CookiesTest.aspx. Тази страница просто получава стойността на бисквитката. Тази стойност се записва в потока от отговори:

Сега нека компилираме и изпълним кода. Тази програма прави заявка към CookiesTest.aspx и показва отговора в WPF текстов елемент. По-долу е изходът от съдържанието на страницата, когато програмата се изпълни. Както можете да видите, стойността на бисквитката MyName е получена от страницата ASP.NET:

бисквитката

Четене на бисквитки на клиента

С помощта на пространството на имената System.Net на .NET Framework четенето на бисквитка е толкова лесно, колкото и писането й. За да видим това, отново използваме много проста ASP.NET страница, наречена WriteCookie.aspx. Тази страница просто създава нов запис за бисквитка и изпраща на клиента:

Като поискате тази страница отклиент, можем да получим достъп до записа на бисквитката, наречен потребителско име, чрез свойството Cookies на класа HttpWebResponse:

Стойността на бисквитката може да бъде прочетена веднага щом заглавките на заявката бъдат получени чрез извикването на метода GetResponse().

Обърнете внимание, че колекцията Cookies на обекта HttpWebResponse ще бъде попълнена само ако е зададено свойството CookieContainer на съответния HttpWebRequest. В противен случай трябва да прочетете бисквитката от колекцията Headers. Записите за бисквитки се изпращат в заглавка Set-Cookie в приблизително следния формат: