Контекст контроллера

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

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

Кроме тех данных, которые передаются через параметры метода, в контроллере мы можем получить различную информацию, связанную с контекстом контроллера, в том числе контекст запроса и все его данные. Для получения контекста в контроллере нам доступно свойство ControllerContext, которое представляет одноименный класс ControllerContext. Этот класс определяет ряд важный свойств:

  • HttpContext: содержит информацию о контексте запроса

  • ActionDescriptor: возвращает дескриптор действия - объект ActionDescriptor, который описывает вызываемое действие контроллера

  • ModelState: возвращает словарь ModelStateDictionary, который используется для валидации данных, отправленных пользователем

  • RouteData: возвращает данные маршрута

Для получения информации о запросе нас прежде всего будет интересовать свойство HttpContext, которое представляет объект Microsoft.AspNetCore.Http.HttpContext. Это свойство также доступно через свойство HttpContext в контроллере. То есть следующие вызовы будут обращаться к одному и тому же объекту:

var ctx1 = ControllerContext.HttpContext;
var ctx2 = HttpContext;

Объект HttpContext инкапсулирует всю информацию о запросе. В частности, он определяет следующие свойства:

  • Request: содержит собственно информацию о текущем запросе.

  • Response: управляет ответом

  • User: представляет текущего пользователя, который обращается к приложению

  • Session: объект для работы с сессиями

Request

Свойство HttpContext.Request представляет объект HttpRequest и предоставляет разнообразную информацию о запросе. Этот же объект доступен через свойство Request класса Conroller. Среди свойств объекта Request можно выделить следующие:

  • Body: объект Stream, который используетя для чтения данных запроса

  • Cookies: куки, полученные в запросе

  • Form: коллекция значений отправленных форм

  • Headers: коллекция заголовков запроса

  • Path: возвращает запрошенный путь - строка запроса без домена и порта

  • Query: возвращает коллекцию переданных через строку запроса параметров

  • QueryString: возвращает ту часть запроса, которая содержит параметры. Например, в запросе http://localhost:52682/Home/Index?alt=4 это будет ?alt=4

Вся основная информация нам доступна из заголовков. Например, получим все имеющиеся заголовки и выведем их в браузере:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;

namespace ControllerContextApp.Controllers
{
    public class HomeController : Controller
    {
        public void Index()
        {
            string table = "";
            foreach(var header in Request.Headers)
            {
                table += $"<tr><td>{header.Key}</td><td>{header.Value}</td></tr>";
            }
            Response.WriteAsync($"<table>{table}</table>");
        }
    }
}

Получим значения определенных заголовков:

string userAgent = Request.Headers["User-Agent"].ToString();
string referer = Request.Headers["Referer"].ToString();

Response

Свойство HttpContext.Response представляет объект HttpResponse и позволяет управлять ответом на запрос, в частности, устанавливать заголовки ответа, куки, отправлять в выходной поток некоторый ответ. Этот же объект доступен через свойство Response класса Conroller. Среди свойств объекта Response можно выделить следующие:

  • Body: объект Stream, который применяется для отправки данных в ответ пользователю

  • Cookies: куки, отправляемые в ответе

  • ContentType: MIME-тип ответа

  • Headers: коллекция заголовков ответа

  • StatusCode: статусный код ответа

Также с помощью объекта Response мы можем отправить ответ клиенту с помощью метода WriteAsync():

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;

namespace ControllerContextApp.Controllers
{
    public class HomeController : Controller
    {
        public void Index()
        {
            Response.StatusCode = 404;
            Response.WriteAsync("Ресурс не найден");
        }
    }
}

Для использования метода WriteAsync() необходимо импортировать пространство имен Microsoft.AspNetCore.Http.

То есть фактически нам необязательно отправлять какой-то результат обработки запроса в виде ViewResult или других объектов. Мы вполне может в простых ситуациях обойтись методом Response.WriteAsync().

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