Так как контроллер отвечает за обработку запроса, иногда бывает важно получить такую информацию о запросе как метод 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.
