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 }); } }
Erstellen Sie einen Controller mit dem Namen 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"; } }
Starten und ausführen, geben Sie in der Adressleiste des Browsers http: ein//localhost:46351/api/home und http://localhost:46351/api/home/5Das Ergebnis ist wie folgt:
Nach einem kurzen Blick auf das Beispiel von Asp.Net Web API, beginnen wir mit der Analyse des Routensystems von Asp.Net Web API.
Zunächst einmal einen Blick auf die Art der Routenregistrierung in Asp.Net Web API, wie folgt:
Welche Operationen sind in diesem Prozess der Routenregistrierung versteckt? Nachfolgend unser Quellcode:
Durch das Durchsehen des Quellcodes können wir erkennen, dass die Registrierung der Routen in Asp.Net Web API tatsächlich durch Aufruf der erweiterten Methode MapHttpRoute des HttpRouteCollection-Typs implementiert wird. Innerhalb der Methode MapHttpRoute sehen wir, dass das erstellte Routenobjekt durch Aufruf der Methode Add des HttpRouteCollection-Objekts gespeichert wird. Da die statische Eigenschaft von GlobalConfiguration durch Configuration als HostedHttpRouteCollection-Typ mit RouteTable.Routes als Konstruktionsparameter erstellt wird und da der HostedHttpRouteCollection-Typ eine Unterklasse des HttpRouteCollection-Typs ist, überschreibt der Unterklassetyp HostedHttpRouteCollection in HostedHttpRouteCollection-Typ die Add- und CreateRoute-Methode des übergeordneten Typs, wie im folgenden Bild gezeigt. Daher ist der Typ des tatsächlich erstellten Routenobjekts HostedHttpRoute. Dieser Routenobjekt wird in die globale Routentabelle gespeichert, daher können wir erkennen, dass der Typ der in die globale Routentabelle gespeicherten Routenobjekte HostedHttpRoute ist. Was nützt es, die registrierten Routenobjekte in die globale Routentabelle zu speichern? Dies wird im folgenden Teil analysiert.
Wie aus dem obigen Quellcode zu sehen ist, ist das letztendlich erstellte Routenobjekt vom Typ HostedHttpRoute, daher stellt sich die Frage, woher die RouteHandler und HttpHandler hinzugefügt wurden, als wir die Routen registriert haben? Welche Geheimnisse gibt es im Prozess der Erstellung des HostedHttpRoute-Objekts? Wir schauen uns weiter im Quellcode an:
Durch die Analyse des obigen Artikels können wir bis jetzt wissen, dass in Asp.Net Web API, wenn es im Modus WebHost untergebracht ist, die registrierten Routenobjekte vom Typ HostedHttpRoute sind und in der globalen Routentabelle RouteTable.Routes gespeichert sind. Die RouteHandler und HttpHandler, die für die Verarbeitung der Anfragen verwendet werden, sind die Instanzen von HttpControllerRouteHandler und HttpControllerHandler.
Nachdem die Routeninformationen registriert wurden, wie nutzt Asp.Net Web API die registrierten Routeninformationen, um zu routingen? Wird es auch wie in Asp.Net durch einen HttpModule implementiert? Wir starten das Programm und schauen uns die Eigenschaft Modules der Klasse Global an:
Wie aus dem obigen Screenshot klar zu sehen ist, wird in Asp.Net Web API, wenn der Service im Modus WebHost untergebracht ist, wie in ASP.Net auch, durch das UrlRoutingModule geroutet. Aus dem vorherigen Artikel über die Analyse des Asp.Net Routing-Systems können wir wissen, dass Asp.Net die Anfragen durch das UrlRoutingModule abfängt und dann nacheinander die globale Routentabelle durchsucht, um die mit der Anfrage-URL übereinstimmende RouteData zu erhalten und weiter zu verarbeiten. In Asp.Net Web API, wie wir aus dem obigen Artikel wissen, ist der in der globalen Routentabelle gespeicherte Routenobjekt vom Typ HostedHttpRoute, und wir analysieren weiter, wie in Asp.Net Web API letztendlich die passende RouteData erhalten wird.
In der Klasse UrlRoutingModule wird RouteData durch das nacheinander Aufrufen der Methode GetRouteData jedes Routing-Objekts erhalten. In Asp.Net Web API, da der Typ des Routing-Objekts HostedHttpRoute ist, sehen wir unten, was passiert, wenn die Methode GetRouteData aufgerufen wird:
可以看到,在HostedHttpRoute中是通过属性OriginalRoute的GetRouteData方法获取RouteData的,由前文的分析中,我们知道这个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时,是通过Asp.Net路由系统的匹配规则进行路由匹配的,但实现了自己的约束验证规则。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
声明:本文内容来自网络,版权属于原作者。内容由互联网用户自发贡献并自行上传,本网站不拥有所有权,未进行人工编辑处理,也不承担相关法律责任。如果您发现涉嫌版权的内容,请发送邮件至:notice#oldtoolbag.com(在发送邮件时,请将#替换为@进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权内容。)