2013年12月9日 星期一

[C#] 多個HTTP Post 方法在同一個Web API controller

多個HTTP Post 方法在同一個Web API controller

最近又要開始寫Http服務, 先前在某個route(或說某個Controller)下,只會針對單一種Request內容作處理,這次則設計成在同一個route下處理多種不同的Request

1.  一開始異想天開的寫個interface 當成POST方法的參數,結果因為送出的Request欄位會超出interface的定義,結果失敗~

2.  接下來也是很天真地寫上兩個POST方法在同一個Controller,結果出現route下有兩個POST方法造成無法識別要使用哪個方法的錯誤 ~____~ 

3.  最後終於利用的方法解決:
u  打開(App_Start\WebApiConfig.cs),修改WebApiRoute的預設設定:

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

這邊可以看到我們將原本的Route : api/{controller}/{id}
修改為:api/{controller}/{action}/{id}
另外再加入為了要多個POST方法的Route設定:

config.Routes.MapHttpRoute(
       name:
"TransApi",
       routeTemplate:
"api/{controller}/{action}/{id}",
       defaults:
new { id = RouteParameter.Optional },
      
constraints: new { action="XXX|YYY|ZZZ" }
);

=>
這邊設定指定的action必須是XXX or YYY or ZZZ or …

u  接下來是最麻煩的部分,原本Controller中的所有CRUD方法都必須另外指定Route中的action name

例如 GET 方法,將action name設定為Default
[HttpGet,ActionName("Default")]

至於POST方法,就可以用action name區別不同的Route路徑:
[
HttpPost,ActionName("XXX")]
public C Post(A item)
{ }

[
HttpPost,ActionName("YYY")]
public C Post(B item)
{ }

4.  實際Call http service時,必須以我們新設定的Route的網址,例如假設我們的Controller名稱為ValueController

http://localhost/MyApi/Value  (Get,
沒有影響)

沒有留言:

張貼留言