English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在上篇文章中我们分析了Asp.Net路由系统,今天我们再来简单分析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是如何实现的。我们还是从一个简单的例子开始。
创建一个空的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 }); } }
Crear un Controller llamado 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"; } }
Luego de ejecutar y comenzar, ingrese en la barra de direcciones del navegador http://localhost:46351/api/home y http://localhost:46351/api/home/5El resultado es el siguiente:
Después de una revisión rápida de la instancia de Asp.Net Web API, comenzaremos a analizar el sistema de rutas de Asp.Net Web API.
Primero, echemos un vistazo a la manera de registrar rutas en Asp.Net Web API, como se muestra a continuación:
¿Qué operaciones se ocultan en este proceso de registración de rutas? A continuación, veremos el código fuente:
Al revisar el código fuente, podemos ver que la registración de rutas en Asp.Net Web API se realiza mediante la invocación del método de extensión MapHttpRoute del tipo HttpRouteCollection. Dentro del método MapHttpRoute, vemos que el objeto de ruta creado se guarda mediante la invocación del método Add del objeto HttpRouteCollection. Además, debido a que la propiedad estática GlobalConfiguration de tipo HostedHttpRouteCollection se crea con el constructor RouteTable.Routes como parámetro de construcción, y dado que HostedHttpRouteCollection es una subclase del tipo HttpRouteCollection, en la subclase HostedHttpRouteCollection se sobrescribe el método Add y el método CreateRoute de la clase padre, como se muestra en la imagen siguiente, por lo que, en realidad, el tipo del objeto de ruta creado es HostedHttpRoute. Este objeto de ruta se coloca en la tabla de rutas globales y se puede saber aquí que el tipo de los objetos de ruta guardados en la tabla de rutas global es HostedHttpRoute. Entonces, ¿para qué sirve guardar el objeto de ruta registrado en la tabla de rutas global? Analizaremos esta parte más adelante.
A partir del código fuente anterior, se puede ver que el objeto de ruta creado finalmente es del tipo HostedHttpRoute, por lo que ahora hay un problema: al registrar la ruta anteriormente, no especificamos RouteHandler y HttpHandler, ¿dónde se agregan a la ruta? En el proceso de creación del objeto HostedHttpRoute, ¿cuáles son los secretos ocultos? A continuación, continuamos revisando el código fuente:
A partir del análisis anterior, hasta ahora, podemos saber que al hospedar Asp.Net Web API de manera WebHost, el objeto de ruta registrado es una instancia del tipo HostedHttpRoute, almacenada en la tabla de rutas global RouteTable.Routes, y los RouteHandler y HttpHandler utilizados para procesar solicitudes son instancias del tipo HttpControllerRouteHandler y HttpControllerHandler, respectivamente.
Después de registrar la información de la ruta, ¿cómo se utiliza la información de la ruta registrada en Asp.Net Web API para realizar la ruta? ¿Será también implementado de la misma manera que en Asp.Net a través de un HttpModule? Vamos a ver la propiedad Modules de la clase Global:
A partir de la captura de pantalla anterior, se puede ver claramente que, al hospedar el servicio en Asp.Net Web API de manera WebHost, también como en ASP.Net, se realiza la路由通过 UrlRoutingModule. En el análisis anterior de la sistema de enrutamiento de Asp.Net, podemos saber que Asp.Net realiza la interceptación de solicitudes a través de UrlRoutingModule, luego realiza una coincidencia sucesiva en la tabla de rutas global para obtener RouteData coincidente con la URL de solicitud para el procesamiento posterior. En Asp.Net Web API, como se mencionó en el texto anterior, el objeto de ruta almacenado en la tabla de rutas global es del tipo HostedHttpRoute, y a continuación, continuamos analizando cómo se obtiene el RouteData coincidente en Asp.Net Web API.
En el UrlRoutingModule, RouteData se obtiene llamando sucesivamente al método GetRouteData de cada objeto de ruta. En Asp.Net Web API, dado que el tipo del objeto de ruta es HostedHttpRoute, veamos lo que ocurre al llamar al método GetRouteData:
Se puede ver que en HostedHttpRoute se obtiene RouteData a través del método GetRouteData de la propiedad OriginalRoute, como se mencionó en el análisis anterior, esta propiedad OriginalRoute es del tipo HttpWebRoute:
A partir del análisis anterior, se puede ver que cuando Asp.Net Web API se despliega de manera WebHost,最终还是 a través del sistema de rutas de Asp.Net se completa el trabajo de coincidencia. Sin embargo, es necesario prestar atención a que, debido a que se ha sobrescrito el método de validación de restricciones del tipo padre en HttpWebRoute, Asp.Net Web API aún utiliza su propio método para validar si las restricciones coinciden:
Finalmente, después de obtener una serie de trabajos el objeto RouteData y el RouteHandler, HttpHandler incluidos en él, Asp.Net Web API puede realizar el procesamiento de solicitudes y respuestas a través de estos.
Resumen:
A través del análisis del texto anterior, se puede concluir: cuando Asp.Net Web API se despliega de manera WebHost, los rutas registrados se almacenan en la tabla de rutas global; en el momento de obtener RouteData, se realiza la coincidencia de rutas a través de las reglas de coincidencia del sistema de rutas de Asp.Net, aunque también se implementan sus propias reglas de validación de restricciones.
Eso es todo el contenido de este artículo, espero que ayude a su aprendizaje y que todos lo apoyen más en el tutorial de grito.
Declaración: El contenido de este artículo se obtiene de la red, pertenece al propietario original, el contenido se contribuye y sube de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha editado manualmente y no asume la responsabilidad legal correspondiente. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplaza # con @ para denunciar y proporcionar evidencia. Si se encuentra contenido infractor, este sitio eliminará inmediatamente el contenido sospechoso.).