如何解決Asp.Net MVC和WebAPI的Controller名稱不能相同的問題


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");

好了問題解決~~~

代碼示例下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM