解決webApi An error has occurred. 不能寫多個Get方法的問題


   最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。

   十年河東十年河西,莫欺少年窮。 

   本人最近在研究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就是不修復,還得我們自己百度找答案!

   @陳卧龍的博客

   


免責聲明!

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



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