{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");
好了問題解決~~~繼承