English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Анализ системы маршрутизации Web API в Asp.Net - способ развертывания WebHost

В предыдущей статье мы анализировали систему маршрутизации Asp.Net, сегодня мы рассмотрим, как реализована внутренняя система маршрутизации Asp.Net Web API при部署 в видеWebHost. Начнем с простого примера.

Создайте пустой проект WebApi и зарегистрируйте информацию о маршрутах в Global:

  public class WebApiApplication : System.Web.HttpApplication
  {
    protected void Application_Start()
    {
      //регистрация маршрутов
      GlobalConfiguration.Configuration.Routes.MapHttpRoute(
        name: "default",
        routeTemplate: "api/{controller}/{id}", 
        defaults: new { id = RouteParameter.Optional });
    }
  }

Создайте контроллер с именем Home:

  public class HomeController : ApiController
  {
    // GET: api/Home
    public IEnumerable<string> Get()
    {
      return new string[] { "value1", "value2" };
    }
    // GET: api/Home/5
    public string Get(int id)
    {
      return "value";
    }
  }

Запустите и выполните, в адресной строке браузера введите http://localhost:46351/api/home и http://localhost:46351/api/home/5, результат показан ниже:

 

Просто рассмотрев пример Asp.Net Web API, начнем анализировать систему маршрутов Asp.Net Web API.

Сначала посмотрим на способ регистрации маршрутов в Asp.Net Web API, как показано ниже:

 

В процессе регистрации маршрутов скрыты какие действия? Нíже мы видим исходный код:

 

Прочитав исходный код, можно увидеть, что регистрация маршрутов в Asp.Net Web API осуществляется через вызов расширяемого метода MapHttpRoute типа HttpRouteCollection. В методе MapHttpRoute我们看到 созданный объект маршрута сохраняется с помощью метода Add объекта HttpRouteCollection. А так как статическая свойство GlobalConfiguration через Configuration создается типа HostedHttpRouteCollection с RouteTable.Routes в качестве параметра конструктора, а тип HostedHttpRouteCollection является подклассом типа HttpRouteCollection, в типе HostedHttpRouteCollection подкласс HostedHttpRouteCollection перезаписывает методы Add и CreateRoute родительского класса, как показано на рисунке, поэтому на самом деле тип созданного объекта маршрута является HostedHttpRoute. Этот объект маршрута сохраняется в глобальной таблице маршрутов, из этого мы можем понять, что тип объектов маршрутов, сохраненных в глобальной таблице маршрутов, является HostedHttpRoute. Тогда, для чего сохраняется объект маршрута, зарегистрированный в глобальной таблице маршрутов, анализ в последующих частях.

 

Из вышеуказанного исходного кода можно видеть, что созданный в конечном итоге объект маршрутизации имеет тип HostedHttpRoute, так что теперь у нас есть вопрос: при регистрации маршрутизации мы не指定ывали RouteHandler и HttpHandler, откуда они добавляются в объект маршрутизации? Какие тайны скрываются в процессе создания объекта HostedHttpRoute? Мы продолжим анализ исходного кода ниже:

 

По анализу上文, до сих пор мы можем знать, что в Asp.Net Web API, когда сервис хостится в режиме WebHost, зарегистрированные объекты маршрутизации имеют тип HostedHttpRoute, сохраняются в глобальной маршрутизационной таблице RouteTable.Routes, а RouteHandler и HttpHandler, используемые для обработки запросов, представляют собой экземпляры HttpControllerRouteHandler и HttpControllerHandler соответственно.

 После регистрации маршрутизации, как Asp.Net Web API использует зарегистрированную информацию о маршрутизации для маршрутизации? Неужели это также реализуется через HttpModule, как в ASP.Net? Давайте запустим программу и посмотрим на атрибут Modules в классе Global:

 

Из вышеуказанного скриншота можно清楚地 видеть, что в Asp.Net Web API, когда сервис хостится в режиме WebHost, как и в ASP.Net, маршрутизация также реализуется через UrlRoutingModule. Из анализа системы маршрутизации Asp.Net, который был рассмотрен в предыдущей статье, мы знаем, что Asp.Net拦截 запросы с помощью UrlRoutingModule, а затем последовательно выполняет совпадение с глобальным маршрутизационным таблицей, чтобы получить RouteData, соответствующий URL запроса, для дальнейшей обработки. В Asp.Net Web API, как мы знаем из上文, сохраненные в глобальной маршрутизационной таблице объекты маршрутизации имеют тип HostedHttpRoute, и далее мы продолжим анализ того, как в Asp.Net Web API в конечном итоге получают соответствующий RouteData.

В UrlRoutingModule RouteData получается поочередным вызовом метода GetRouteData каждого объекта маршрутизации. В Asp.Net Web API, так как тип объекта маршрутизации - HostedHttpRoute, давайте посмотрим, что происходит при вызове метода GetRouteData:

 

可以看出, в HostedHttpRoute RouteData получают через метод GetRouteData属性 OriginalRoute, как мы знаем из предыдущего анализа, этот OriginalRoute является типом HttpWebRoute:

 

 Из анализа可以看出, при развертывании Asp.Net Web API в режиме WebHost, в конечном итоге маршрутизация выполняется через систему маршрутизации Asp.Net. Однако есть одно важное замечание: поскольку в HttpWebRoute метод проверки ограничений родительского типа был переписан, Asp.Net Web API использует свои собственные методы для проверки соответствия ограничений:

В конце концов, после получения RouteData объекта и RouteHandler, HttpHandler, включенных в него, Asp.Net Web API может обрабатывать запросы и ответы через эти полученные.

 Обобщение:

Анализируя上文, можно сделать вывод: при развертывании Asp.Net Web API в режиме WebHost, зарегистрированные маршруты сохраняются в глобальной таблице маршрутов; при получении RouteData, маршрутыmatchCondition системы маршрутизации Asp.Net выполняются для маршрутизации, но реализованы свои правила проверки ограничений.

Вот и все, что есть в этой статье, надеюсь, это поможет вам в изучении, и希望大家多多支持呐喊教程。

Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета, сайт не имеет права собственности, не был отредактирован вручную, и не несет ответственности за связанные с этим юридические последствия. Если вы обнаружите подозрительное содержание, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @), чтобы сообщить о нарушении авторских прав,并提供 соответствующие доказательства. При подтверждении факта нарушения авторских прав сайт незамедлительно удалят涉嫌侵权的内容.

Вам может понравиться