如何解決Asp.Net MVC和WebAPI的Controller名稱不能相同的問題
阿新 • • 發佈:2018-11-02
原文:
如何解決Asp.Net MVC和WebAPI的Controller名稱不能相同的問題
類中,微軟有定義
我們只要把
這個欄位是個靜態只讀的Field,我們只要把它改成
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");
好了問題解決~~~