1甫煞、問(wèn)題描述
假如有一個(gè)文章的業(yè)務(wù)(Article)遏考,我們?cè)?Controllers文件夾中創(chuàng)建MVC Controller和Api Controller,各個(gè)Controller中都有相同的獲取文章內(nèi)容的Action(Content)。路由為默認(rèn)設(shè)置
MVC的路由為
{controller}/{action}/{id}
Api的路由為
api/{controller}/{action}/{id}
然而我希望訪問(wèn)的
- MVC的URL為
~/Article/Content/1
- API的URL為
~/api/Article/Content/1
那么就是MVC和API的控制器都應(yīng)該命名為ArticleController
愚臀,其中MVC控制器繼承與Controller
嗅剖,API控制器繼承ApiController
辩越。但是兩個(gè)控制器肯定不能重名啊。
那我們先把API的名字改為ArticleApiController
,So 訪問(wèn)路徑為api/ArticleApi/Content/1
可是這樣不是個(gè)事兒啊~~
So......We need change the controller name!
2信粮、問(wèn)題原因
通過(guò)查看微軟System.Web.Http
的源碼黔攒,我們發(fā)現(xiàn)其實(shí)這個(gè)問(wèn)題也很好解決,在這個(gè)DefaultHttpControllerSelector
類(lèi)中强缘,微軟有定義Controller
的后綴督惰,如圖
我們只要把ApiController
的后綴改成和MVC不一樣,就可以解決問(wèn)題了旅掂。
這個(gè)字段是個(gè)靜態(tài)只讀的Field赏胚,我們只要把它改成ApiContrller
就解決問(wèn)題了
3、問(wèn)題解決
可以利用反射解決這個(gè)問(wèn)題商虐,在注冊(cè)API路由前添加以下代碼即可解決
var suffix = typeof(DefaultHttpControllerSelector).GetField("ControllerSuffix", BindingFlags.Static | BindingFlags.Public);
if (suffix != null) suffix.SetValue(null, "ApiController");
好了觉阅,問(wèn)題解決~~~