如何解決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");

好了問題解決~~~繼承

代碼示例下載
相關文章
相關標籤/搜索