1、问题描述 
假如有一个文章的业务(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 可是这样不是个事儿啊~~  
So......We need change the controller name!  
2、问题原因 
通过查看微软System.Web.Http的源码,我们发现其实这个问题也很好解决,在这个DefaultHttpControllerSelector类中,微软有定义Controller的后缀,如图  我们只要把ApiController的后缀改成和MVC不一样,就可以解决问题了。  这个字段是个静态只读的Field,我们只要把它改成ApiContrller就解决问题了  
   
3、问题解决 
可以利用反射解决这个问题,在注册API路由前添加以下代码即可解决  
 var suffix = typeof(DefaultHttpControllerSelector).GetField("ControllerSuffix", BindingFlags.Static | BindingFlags.Public);
if (suffix != null) suffix.SetValue(null, "ApiController");
  
   
 
 好了问题解决~~~  
  
 |