Asp.Net网络应用编程接口路由系统分析——网络主机部署模式
在前一篇文章中,我们分析了Asp.Net的路由系统。今天,我们将简要分析Asp.Net网络应用编程接口以网络主机的方式部署时,Asp.Net网络应用编程接口的路由系统是如何实现的。或者从一个简单的例子开始。
创建一个空的网络应用编程接口项目,并在全局:
公共类WebApiApplication :系统。web . HttpApplication { protected void Application _ Start(){//注册路由global configuration . configuration . routes . maphttpute(name : ' default ',route template 3360 ' API/{ controller }/{ id } ',defaults 3360 new { id=route parameter . optional });}}创建名为Home的控制器:
公共类Homecontroller : APi controller {//GET: API/Home公共IEnumerablesting Get(){返回新字符串[] { 'value1 ',' value 2 ' };} //GET: api/Home/5公共字符串Get(int id){ return ' value ';}}开始运行,在浏览器地址栏分别输入http://localhost :46351/API/home和http://localhost 336046351/API/home/5。结果如下:
在简单介绍了Asp.Net网络应用编程接口的例子后,我们开始分析Asp.Net网络应用编程接口的路由系统。
首先看一下Asp.Net Web API中路由的注册方式,如下:
在这个路线注册过程中隐藏了哪些操作?下面是我们的源代码:
通过源代码可以看到,在Asp.Net Web API中注册路由实际上是通过调用httproute类型的扩展方法MapHttpProute来实现的。在MapHttpProute方法中,我们可以看到创建的路由对象是通过调用HttpProuteCollection对象的Add方法保存的。因为全局配置的静态属性是用RouteTable创建的。通过配置作为构造参数的路由是hostedhtproutecollection类型,并且因为hostedhtproutecollection类型是HttpRouteCollection类型的子类,所以子类hostedhtproutecollection会覆盖父类型的Add方法和CreateRoute方法,如下图所示,所以实际上,创建的路由对象的类型是HostedHttpProute,保存在全局路由表中。从这里,我们可以知道保存在全局路由表中的路由对象的类型是HostedHttpProute。那么,在全局路由表中保存注册的路由对象有什么用呢?以下部分分析。
从上面的源代码可以看出,最终创建的路由对象是HostedHttpRoute类型,所以现在出现了一个问题。注册路由时,我们没有指定RouteHandler和HttpHandler。它们添加到路由对象的什么位置?在创建HostedHttpRoute对象的过程中有哪些隐藏的秘密?让我们继续检查下面的源代码:
通过以上分析,到目前为止,我们可以知道,当Asp.Net Web API在WebHost模式下托管时,注册的路由对象是HostedHttpRoute类型的一个实例,存储在全局路由表RouteTable中。用于处理请求的Routes、RouteHandler和HttpHandler分别是HttpControllerRouteHandler类型的实例和HttpControllerHandler类型的实例。
注册路由信息后,如何在Asp.Net Web API中使用注册的路由信息进行路由?它会像在Asp.Net那样通过一个HttpModule实现吗?让我们启动程序,看看全局类中的模块属性:
从上面的截图可以清楚的看到,Asp.Net web API在以WebHost的方式托管服务时,也像ASP.Net一样通过UrlRoutingModule实现路由。从前面对Asp.Net路由系统的分析中我们可以知道,Asp.Net通过UrlRoutingModule截取请求,然后从全局路由表中依次进行匹配,得到与请求Url匹配的RouteData进行后续处理。在Asp.Net web API中,我们从上面得知存储在全局路由表中的路由对象是HostedHttpRoute类型,然后我们继续分析匹配的RouteData是如何在Asp.Net web API中最终获得的。
在UrlRoutingModule中,RouteData是通过依次调用每个路由对象的GetRouteData方法获得的。在Asp.Net网络应用编程接口中,由于路由对象的类型是HostedHttpRoute,我们来看看调用GetRouteData方法时会发生什么:
可以看到RouteData是通过HostedHttpRoute中的属性OriginalRoute的GetRouteData方法得到的。从前面的分析中,我们知道这个OriginalRoute属性的类型是HttpWebRoute:
从上面的分析可以看出,当以WebHost的方式部署Asp.Net Web API时,匹配工作最终是通过Asp.Net的路由系统完成的。但是,需要注意的是,因为验证父类型的约束的方法在HttpWebRoute中被重写,所以Asp.Net Web API仍然使用自己的方式来验证约束是否匹配:
最后,在通过一系列的工作获得RouteData对象以及其中包含的RouteHandler和HttpHandler之后,Asp.Net web API就可以通过这些获得的对象来处理和响应请求。
总结:
通过以上分析,可以得出结论:当以WebHost的方式部署Asp.Net web API时,注册的路由保存在全局路由表中;在获取RouteData时,它通过Asp.Net路由系统的匹配规则来匹配路由,但它实现了自己的约束验证规则。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:Asp.Net网络应用编程接口路由系统分析——网络主机部署模式是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。