{controller}/{action}/{id}
api/{controller}/{action}/{id}
~/Article/Content/1
~/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");
好了问题解决~~~继承