天天看点

WebAPI增加Area以支持无限层级同名Controller

<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方法中替换注册

继续阅读