1. 程式人生 > >解決.NET Web API生成的Help無Controller說明&服務端接收不到請求

解決.NET Web API生成的Help無Controller說明&服務端接收不到請求

今天在用.NET Web API寫一個介面的時候遇到一個問題。在Controller中新加了一個方法,客戶端就不能請求介面了,當時建WEB API專案是用的VS預設設定,在服務端打斷點一直沒有進去,而APP端一直報服務端響應失敗!奇怪的是連生成的Help API說明都沒Controller說明。

這樣也辦法用WebAPITestClient測試,後來用想到了用HttpRequester外掛請求一下介面果然出錯了。

<Error><Message>出現錯誤。</Message><ExceptionMessage>找到了與該請求匹配的多個操作: 
型別 Lanhu.

seoDayCharge.API.Controllers.StatsController 的 KeywordsRankDayList
型別 Lanhu.seoDayCharge.API.Controllers.StatsController 的 KeywordsList</ExceptionMessage><ExceptionType>System.InvalidOperationException</ExceptionType><StackTrace>   在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)
   在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
   在 System.Web.Http.Dispatcher.HttpControllerDispatcher.&lt;SendAsync&gt;d__1.MoveNext()</StackTrace></Error>

看來是路由出錯了,找到測試路由的地方:

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.linq;
  4. using System.Web.Http;
  5. namespace Lanhu.seoDayCharge.API
  6. {
  7. public static class WebApiConfig
  8. {
  9. public static void Register(HttpConfiguration config)
  10. {
  11. // Web API 配置和服務
  12. // Web API 路由
  13. config.MapHttpAttributeRoutes();
  14. config.Routes.MapHttpRoute(
  15. name: "DefaultApi",
  16. routeTemplate: "api/{controller}/{id}",
  17. defaults: new { id = RouteParameter.Optional }
  18. );
  19. }
  20. }
  21. }

 

細心的同學可能看到,上面路由規則配置是沒有action的,加上action就ok了。

 

  1. config.Routes.MapHttpRoute(
  2. name: "DefaultApi",
  3. routeTemplate: "api/{controller}/{action}/{id}",
  4. defaults: new { id = RouteParameter.Optional }
  5. );

 

問題原因:

微軟的web api是嚴格遵循realfull設計思想的,其實預設webapi只有 get,post,delete,put 4種方法名。四中方法名,根據你提交的形式來區別。

換句話說用vs建立WEB API專案時路由預設是沒有加Action的,這一點和ASP.NET mvc是有區別的。也就是如果在路由規則中沒有定義action部分,在一個Web API的Controller裡面只能有一個post方式提交的方法,如果新加了一個post方式提交的方法就會出現上面提到錯誤。