Так как контроллер отвечает за обработку запроса, иногда бывает важно получить такую информацию о запросе как метод HTTP, наличие каких-либо заголовков запроса и т.д. В ASP.NET Core MVC классы контроллеров наследуются от базового класса Controller
, который содержит ряд важных для нас свойств, в том числе контекст контроллера и контекст запроса.
Контекст контроллера (ControllerContext)
Когда мы наследуем наш класс контроллера от класса Controller
, то получаем в свое распоряжение ряд полезных свойств и методов. В числе полезных свойств особое внимание можно уделить свойству ControllerContext
, которое имеет одноименный тип — ControllerContext
. Этот класс содержит следующие свойства
Action |
Объект, содержащий дескриптор действия, связанного с текущим запросом. |
Http |
Объект типа HttpContext , связанный с текущим запросом — контекст запроса |
Model |
Коллекция ModelStateDictionary , которая используется для валидации данных, отправленных пользователем |
Route |
Коллекция RouteData , содержащая данные маршрута |
Все эти свойства мы можем использовать при работе контроллера. Например, создадим новое приложение ASP.NET Core MVC и добавим в него новый контроллер:
using Microsoft.AspNetCore.Mvc; namespace FirstMvcSite.Controllers { public class SimpleController : Controller { public string ActionInfo() { var descriptor = ControllerContext.ActionDescriptor; return $"ID = {descriptor.Id} \n Name = {descriptor.ActionName} \n ControllerName = {descriptor.ControllerName}"; } } }
Здесь, в действии ActionInfo()
мы получаем доступ к контексту контроллера и получаем дескриптор действия:
var descriptor = ControllerContext.ActionDescriptor;
после чего выводим часть информации о действии:
return $"ID = {descriptor.Id} \n Name = {descriptor.ActionName} \n ControllerName = {descriptor.ControllerName}";
то есть получаем вот такой вывод для пользователя:
Более интересную и полезную для нас информацию предоставляет нам контекст запроса.
Контекст запроса HttpContext
Контекст запроса содержит исчерпывающую информацию о запросе, а также позволяет формировать ответ пользователю. В числе прочих свойств, класс HttpContext содержит следующие свойства, которые мы можем использовать в приложениях ASP.NET Core MVC:
Items |
Возвращает или задает коллекцию пар «ключ-значение», которую можно использовать для совместного использования данных в области запроса. |
Request |
Объект HttpRequest , содержащий данные запроса. |
Response |
Объект HttpResponse , с помощью которого можно управлять данными ответа сервера. |
Чтобы получить доступ к контексту запроса из контроллера мы можем сделать следующее:
получить доступ к контексту контроллера и через контекст контроллера получить HttpContext, например:
var context = ControllerContext.HttpContext;
использовать свойство HttpContext
, которое наследуется классом Controller
у его предка — класса ControllerBase
:
var context = HttpContext;
В качестве примера, пусть наш контроллер в своем действии будет возвращать пользователю информацию о заголовках запроса:
public class SimpleController : Controller { public async Task ActionInfo() { var context = HttpContext; foreach (var header in context.Request.Headers) { await context.Response.WriteAsync($"{header.Key}: {header.Value} \r\n"); } } }
Результат работы этого действия будет следующим:
Более подробную информацию о контексте запроса можно получить из учебника по базовой модели ASP.NET Core — здесь.
Информацию по формированию ответов с использованием HttpContext
можно посмотреть здесь.
Информацию по работе с данными запроса с использованием HttpContext
можно посмотреть здесь.
Итого
Так как на контроллер возлагается обязанность по обработке запроса пользователя, то с использованием свойств контроллера мы можем получать доступ к контексту запроса — заголовкам, кукам, информации о пользователе и т.д. Для доступа к контексту запроса мы можем использовать свойства контроллера HttpContext
или ControllerContext
.