Контроллеры в Web API и обработка запросов

Введение в контроллеры Web API

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

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

Контроллеры в Web API принимают запрос в виде объекта HttpRequestMessage, обрабатывают его с помощью одного из методов и посылают в ответ результат обработки в виде объекта HttpResponseMessage.

HttpRequestMessage с помощью своих свойств передает ряд данных о запросе:

  • Content: возвращает объект HttpContent, который представляет тело запроса

  • Headers: возвращает набор заголовков запроса в виде объектов HttpRequestHeader

  • Method: тип запроса (Get/Post/Put/Delete)

  • Properties: словарь, который содержит объекты, предоставляемые хостинговой средой

  • RequestUri: запрошенный ресурс URL

  • Version: используемая версия протокола HTTP

Например, получим все заголовки запроса:

public string Get()
{
    string data="";
    foreach(var o in Request.Headers)
    {
        string val = "";
        foreach (string s in o.Value)
        {
            val += s + ";";
        }
        data += o.Key + " : " + val;
    }
    return data;
}

Объект запроса можно получить с помощью свойства Request

В то же время тем, кто привык к объектам контекста в ASP.NET MVC, могут не найти ряда полезных свойств. Например, в MVC через объекты контекста (HttpContext.Current.Request.UserHostAddress) можно получить адрес пользователя. В Web API мы так сделать не сможем, поэтому вполне можем использовать данный объект из mvc:

public string Get(int id)
{
    return System.Web.HttpContext.Current.Request.UserHostAddress;
}

Все контроллеры в Web API, в отличие от MVC, предоставляют реализацию интерфейса IHttpController:

public interface IHttpController {
	Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, 
									CancellationToken cancellationToken);
}

После обработки запроса системой маршрутизации его данные передаются объекту HttpControllerDispatcher. Этот объект уже и вызывает у контроллера метод ExecuteAsync(). В этот метод передается контекст контроллера HttpControllerContext, передающий информацию о запросе, а также объект CancellationToken

Web API имеет базовую встроенную реализацию данного интерфейса в виде класса ApiController, который, как правило, и используется для обработки запросов. Однако мы можем создать и свой контроллер. Например, создадим свой контроллер. Для этого добавим в папку Controllers следующий класс:

using System;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http.Controllers;
using System.Web.Http.Routing;

namespace WebApiApp.Controllers
{
    public class ExchangeController : IHttpController
    {
        public Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext context, 
													CancellationToken cancellationToken)
        {
            return Task<HttpResponseMessage>.Run(() =>
            {
                IHttpRouteData rd = context.RouteData;
                string output = "Неверный запрос";
                if (rd.Values.ContainsKey("id")) 
                { 
                    int sum;
                    if (int.TryParse((string)rd.Values["id"], out sum) && sum>0) 
                    {
                        double result = 1.3 * sum;
                        output = String.Format("За {0} евро вы получите {1} долларов", sum, result);
                    }
                }
                return context.Request.CreateResponse(HttpStatusCode.OK, output);
            });
        }
    }
}

В методе ExecuteAsync запускается новая задача с помощью вызова Task<HttpResponseMessage>.Run(), в котором вычисляется количество долларов, полученных при обмене евро на доллары. Количество евро передается с помощью параметра в строке запроса, который мы получаем из коллекции context.RouteData. Поскольку по умолчанию в Web API определен один маршрут "api/{controller}/{id}", то мы можем использовать последний числовой параметр для передачи суммы евро.

Обратимся к контроллеру по запросу api/exchange/6, и браузер нам выдаст результат:

"За 6 евро вы получите 7,8 долларов"

Как правило, в большинстве случаев вряд ли понадобится реализовывать интерфейс IHttpController, так как мы можем обойтись стандартным классом ApiController. Кроме того, Visual Studio имеет встроенную поддержку шаблонов для генерации контроллеров. Так, при добавлении нового контроллера нам будут доступны следующие опции:

Добавление контроллера Web API

Используя эти опции, можно автоматически создать контроллер со всеми нужными методами, использующими контекст данных для работы с бд.

Информация о контроллере

Используя свойство контроллера ControllerContext, представляющее объект HttpControllerContext, также содержит данные запроса, как и свойство RequestContext. Но кроме этого свойство ControllerContext также содержит и некоторые данные о контроллере.

HttpControllerContext определяет следующие свойства:

  • Configuration: представляет объект HttpConfiguration, который содержит информацию о конфигурации приложения

  • Controller: возвращает контроллер, обрабатывающий текущий запрос

  • ControllerDescriptor: содержит объект HttpControllerDescriptor, который хранит информацию о контроллере

  • Request: данное свойство хранит объект Http.HttpRequestMessage, предоставляющий информацию о запросе

  • RequestContext: представляет объект HttpRequestContext, содержащий информацию о текущем запросе, специфичную для Web API

  • RouteData: хранит данные маршрута

Используя контекст данных, можно получить всю необходимую информацию запросе:

public string Get(int id)
{
    string requestInfo = "Контроллер: " + ControllerContext.ControllerDescriptor.ControllerName;
    requestInfo += " Url: " + ControllerContext.Request.RequestUri + 
        " " + ControllerContext.Request.Method.Method;
    return requestInfo;
}

В данном случае получаем название контроллера, запрошенный путь, а также метод http.

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