<a target="_blank" href="http://www.th7.cn/Program/net/201404/188371.shtml">微软的WebAPI默认实现逻辑</a>
默认实现中不支持同名Controller,否则在访问时会报HttpError,在网上找到了各种路由自实现,如
<a target="_blank" href="http://www.cnblogs.com/guogangj/archive/2013/03/11/2950084.html">给ASP.net Web API的Controller分类</a>
<a target="_blank" href="http://www.haogongju.net/art/2057153">搭建MVC及WebAPI项目框架时碰到的问题集合</a>
在上述地址的帮助下,根据需求,重新编写了AreaHttpControllerSelector,路由原理与上述地址大同小异,均是通过路由匹配拼接FullName,然后匹配最接近的ApiController,而所谓的最接近,就是指如果根据拼接的Name获取到了多个匹配项,则获取命名空间节点数最少的那个ApiController,以保证在多次注册路由规则时,能够按照从繁到简的方式匹配出相应的Controller(需要注意的是AreaHttpControllerSelector是以controller作为结束分割点的),举例如下
假定注册了以下路由匹配规则(controller、action均为WebAPI的路由占用字符)
在Controller目录下存在多层同名且不同层级的Controller,如:
Controller/Area/SameController,对应的命名空间为Controller.Area.SameController
Controller/SameController,对应的命名空间为Controller.SameController
通过api/Area/Same/Get将匹配到Controller/Area/SameController
通过api/Same/Get将匹配到Controller/SameController
相比于参考网址,重新编写的AreaHttpControllerSelector可以支持无限层级的区域,只要命名空间支持,比如
以下是具体的AreaHttpControllerSelector代码
而用法就是在Global文件的Application_Start方法中替换注册