Контроллеры ASP.NET Core MVC. Контекст контроллера и контекст запроса

Так как контроллер отвечает за обработку запроса, иногда бывает важно получить такую информацию о запросе как метод HTTP, наличие каких-либо заголовков запроса и т.д. В ASP.NET Core MVC классы контроллеров наследуются от базового класса Controller, который содержит ряд важных для нас свойств, в том числе контекст контроллера и контекст запроса

Контекст контроллера (ControllerContext)

Когда мы наследуем наш класс контроллера от класса Controller, то получаем в свое распоряжение ряд полезных свойств и методов. В числе полезных свойств особое внимание можно уделить свойству ControllerContext, которое имеет одноименный тип — ControllerContext. Этот класс содержит следующие свойства

ActionDescriptor Объект, содержащий дескриптор действия, связанного с текущим запросом.
HttpContext Объект типа HttpContext,  связанный с текущим запросом — контекст запроса
ModelState Коллекция ModelStateDictionary, которая используется для валидации данных, отправленных пользователем
RouteData Коллекция 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.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии