解決.NET Web API生成的Help無Controller說明&服務端接收不到請求
今天在用.NET Web API寫一個介面的時候遇到一個問題。在Controller中新加了一個方法,客戶端就不能請求介面了,當時建WEB API專案是用的VS預設設定,在服務端打斷點一直沒有進去,而APP端一直報服務端響應失敗!奇怪的是連生成的Help API說明都沒Controller說明。
這樣也辦法用WebAPITestClient測試,後來用想到了用HttpRequester外掛請求一下介面果然出錯了。
<Error><Message>出現錯誤。</Message><ExceptionMessage>找到了與該請求匹配的多個操作:
型別 Lanhu.
型別 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.<SendAsync>d__1.MoveNext()</StackTrace></Error>
看來是路由出錯了,找到測試路由的地方:
- using System;
- using System.Collections.Generic;
- using System.linq;
- using System.Web.Http;
- namespace Lanhu.seoDayCharge.API
- {
- public static class WebApiConfig
- {
- public static void Register(HttpConfiguration config)
- {
- // Web API 配置和服務
- // Web API 路由
- config.MapHttpAttributeRoutes();
- config.Routes.MapHttpRoute(
- name: "DefaultApi",
- routeTemplate: "api/{controller}/{id}",
- defaults: new { id = RouteParameter.Optional }
- );
- }
- }
- }
細心的同學可能看到,上面路由規則配置是沒有action的,加上action就ok了。
- config.Routes.MapHttpRoute(
- name: "DefaultApi",
- routeTemplate: "api/{controller}/{action}/{id}",
- defaults: new { id = RouteParameter.Optional }
- );
問題原因:
微軟的web api是嚴格遵循realfull設計思想的,其實預設webapi只有 get,post,delete,put 4種方法名。四中方法名,根據你提交的形式來區別。
換句話說用vs建立WEB API專案時路由預設是沒有加Action的,這一點和ASP.NET mvc是有區別的。也就是如果在路由規則中沒有定義action部分,在一個Web API的Controller裡面只能有一個post方式提交的方法,如果新加了一個post方式提交的方法就會出現上面提到錯誤。