Контекст запроса HttpContext. Куки. Сессии

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

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

Нередко для обработки запроса требуется информация о контексте запроса: какой у пользователя браузер, ip-адрес, с какой страницы или сайта пользователь попал к нам. И ASP.NET MVC позволяет получить всю эту информацию, используя объект HttpContext.

Хотя в контроллере мы также можем обратиться к объекту ControllerContext, который имеет свойство HttpContext и по сути предоставляет доступ к той же функциональности и информации. Но в то же время между ними есть некоторые различия. Объект HttpContext описывает данные конкретного http-запроса, который обрабатывается приложением. А ControllerContext описывает данные http-запроса непосредственно по отношению к данному контроллеру.

Вся информация о контексте запроса доступна нам через свойства объекта HttpContext. Так, все данные запроса содержится в свойстве Request. HttpContext.Request представляет объект класса, унаследованного от HttpRequestBase, и поэтому содержит все его свойства. Рассмотрим некоторые из них:

  • Получение браузера пользователя: HttpContext.Request.Browser

  • Иногда просто браузера недостаточно, тогда можно обратиться к агенту пользователя: HttpContext.Request.UserAgent

  • Получение url запроса: HttpContext.Request.RawUrl

  • Получение IP-адреса пользователя: HttpContext.Request.UserHostAddress

  • Получение реферера: HttpContext.Request.UrlReferrer == null ? "" : HttpContext.Request.UrlReferrer.AbsoluteUri Так как реферер может быть не определен, то сначала смотрим, не равен ли он null

Например:

public string Index()
{
    string browser = HttpContext.Request.Browser.Browser;
    string user_agent = HttpContext.Request.UserAgent;
    string url = HttpContext.Request.RawUrl;
    string ip = HttpContext.Request.UserHostAddress;
    string referrer = HttpContext.Request.UrlReferrer == null ? "" : HttpContext.Request.UrlReferrer.AbsoluteUri;
    return "<p>Browser: " + browser+"</p><p>User-Agent: "+user_agent+"</p><p>Url запроса: "+url+
        "</p><p>Реферер: " + referrer + "</p><p>IP-адрес: "+ip+"</p>";
}

Отправка ответа

Если HttpContext.Request содержит информацию о запросе, то свойство HttpContext.Response управляет ответом. Оно представляет объект HttpResponse, который передает на сторону клиента некоторые значения: куки, служебные заголовки, сам ответ в виде кода html. Например, установим кодировку ответа: HttpContext.Response.Charset = "iso-8859-2";

Методы объекта HttpResponse позволяют управлять ответом. Например, метод AddHeader позволяет добавить к ответу дополнительный заголовок.

Кроме того, нам необязательно вызывать метод View в действия контроллера, чтобы отправить клиенту ответ запроса. Мы вполне можем воспользоваться методом HttpContext.Response.Write:

public string ContextData()
{
    HttpContext.Response.Write("<h1>Hello World</h1>");
	
    string user_agent = HttpContext.Request.UserAgent;
    string url = HttpContext.Request.RawUrl;
    string ip = HttpContext.Request.UserHostAddress;
    string referrer = HttpContext.Request.UrlReferrer == null ? "" : HttpContext.Request.UrlReferrer.AbsoluteUri;
    return "<p>User-Agent: "+user_agent+"</p><p>Url запроса: "+url+
        "</p><p>Реферер: " + referrer + "</p><p>IP-адрес: "+ip+"</p>";
}

Либо так:

public void ContextData()
{
    HttpContext.Response.Write("<h1>Hello World</h1>");
}

Метод HttpContext.Response.Write здесь добавляет в поток определенное содержимое, переданное в качестве параметра. Но в реальности, конечно, проще использовать методы, генерирующие объекты ActionResult, например, представления.

Определение пользователя

Также объект HttpContext содержит информацию о пользователе в свойстве HttpContext.User:

bool IsAdmin = HttpContext.User.IsInRole("admin"); // определяем, принадлежит ли пользователь к администраторам
bool IsAuth=HttpContext.User.Identity.IsAuthenticated; // аутентифицирован ли пользователь
string login = HttpContext.User.Identity.Name; // логин авторизованного пользователя

Подробнее об идентификации пользователя можно узнать в главе про аутентификацию и авторизацию.

Работа с куки

Чтобы получить куки, нам надо воспользоваться свойством HttpContext.Request.Cookies:

string id =HttpContext.Request.Cookies["id"].Value;

В данном случае, если у нас установлена на стороне клиента куки "id", то мы получим ее значение.

Однако прежде чем получать значения куки, их естественно надо установить. Для установки значения куки мы можем использовать свойство HttpContext.Response. Например, установим в куки значение "id":

HttpContext.Response.Cookies["id"].Value = "ca-4353w";

Сессии

Сессии также, как и куки, используются для хранения некоторых данных, которые можно получить в любом месте приложения. Для работы с ними используется объект Session. Например, установим в одном методе контроллера мы можем установить значение сессии:

public ActionResult Index()
{
	Session["name"] = "Tom";
	return View();
}

А получить можно в другом методе:

public string GetName()
{
	var val = Session["name"];
	return val.ToString();
}

Если мы хотим удалить значение сессии для ключа name, мы можем просто присвоить значение null: Session["name"]=null;

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