最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。
十年河東十年河西,莫欺少年窮。
本人最近在研究C#webAPI相關知識,發現webAPI不能夠支持多個Get方法,這些Get方法有如下一特點:
相同數量的參數,這些參數類型可以不相同。奇怪的是:即使這些方法的返回值不同,方法名不同,但在程序請求執行過程中會出現如下錯誤提示:
<Error> <Message>An error has occurred.</Message> <ExceptionMessage> Multiple actions were found that match the request: System.Net.Http.HttpResponseMessage GetById(Int32) on type WebApiTest.Controllers.PersonController System.String GetBySex(System.String) on type WebApiTest.Controllers.PersonController </ExceptionMessage> <ExceptionType>System.InvalidOperationException</ExceptionType> <StackTrace> at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) </StackTrace> </Error>
譬如:如下兩個方法:
[HttpGet] public HttpResponseMessage GetById(int Id) { list = list.Where(p => p.Id == Id).ToList(); return ResultToJson.toJson(list); } [HttpGet] public HttpResponseMessage GetByName([FromUri]string Name) { list = list.Where(p => p.Name == Name).ToList(); return ResultToJson.toJson(list); }
在請求過程中就會報上述錯誤,究其原因,是因為我們在Get請求時,兩個方法都需要接收一個參數,導致了:不知道應該執行哪個方法的問題。
你可能會問:我寫的方法名不一樣,並且在Get請求時,明確了請求的是哪個方法,為什么還會報錯?
究其原因,是因為WebApiConfig的配置引起的,在你新建的項目中,webApiConfig的配置是不指向Action的,初始的webApiConfig如下:
public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
routeTemplate: "api/{controller}/{id}",從這句可以看出,和Action沒有任何毛關系,所以,GEt請求時:即使你指定了方法名,也會報錯。
因此:我們有必要修改下這個配置,修改成指向特定的Action,也就解決了上述問題。修改后的代碼如下:
public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = RouteParameter.Optional } ); }
所以嘛,我認為VS項目初始化腦殘,故意給我們程序員找麻煩,明知道潛在的問題,TMD就是不修復,還得我們自己百度找答案!
@陳卧龍的博客