如何解决Asp.Net MVC和WebAPI的Controller名称不能相同的问题

一、问题描述

假若有一个文章的业务(Article),咱们在 Controllers文件夹中建立MVC Controller和Api Controller,各个Controller中都有相同的获取文章内容的Action(Content)。路由为默认设置
MVC的路由为
{controller}/{action}/{id}
Api的路由为
api/{controller}/{action}/{id}
然而我但愿访问的
  • MVC的URL为 ~/Article/Content/1
  • API的URL为 ~/api/Article/Content/1

那么就是MVC和API的控制器都应该命名为ArticleController,其中MVC控制器继承与Controller,API控制器继承ApiController。可是两个控制器确定不能重名啊。
那咱们先把API的名字改成ArticleApiController,So 访问路径为api/ArticleApi/Content/1 但是这样不是个事儿啊~~api

So......We need change the controller name!mvc

二、问题缘由

经过查看微软System.Web.Http的源码,咱们发现其实这个问题也很好解决,在这个DefaultHttpControllerSelector类中,微软有定义Controller的后缀,如图
咱们只要把ApiController的后缀改为和MVC不同,就能够解决问题了。
这个字段是个静态只读的Field,咱们只要把它改为ApiContrller就解决问题了code

三、问题解决

能够利用反射解决这个问题,在注册API路由前添加如下代码便可解决blog

var suffix = typeof(DefaultHttpControllerSelector).GetField("ControllerSuffix", BindingFlags.Static | BindingFlags.Public);
if (suffix != null) suffix.SetValue(null, "ApiController");

好了问题解决~~~继承

代码示例下载
相关文章
相关标签/搜索