English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В предыдущей статье мы анализировали систему маршрутизации 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 (во время отправки письма замените # на @), чтобы сообщить о нарушении авторских прав,并提供 соответствующие доказательства. При подтверждении факта нарушения авторских прав сайт незамедлительно удалят涉嫌侵权的内容.