0

以下工作:重載WebAPI控制器操作不適用於viewmodels?

public class UsageController : ApiController 
{ 
    public int GetMilk(string param1, string param2) 
    { 
     return -1; 
    } 

    public string GetBilling(string param1) 
    { 
     return null; 
    } 
} 

但下面拋出一個「多的行動中發現匹配的要求,即」異常?!?!

public class UsageController : ApiController 
{ 
    public int GetMilk(MilkVM vm) 
    { 
     return -1; 
    } 

    public string GetBilling(BillingVM vm) 
    { 
     return null; 
    } 
} 

我該如何解決這個問題?

+0

您如何希望WebAPI能夠知道您的URI中的參數是否屬於MilkVM或BillingVM? –

+0

通過比較每個視圖模型上可用的參數? –

回答

0

默認情況下,ASP.NET Web API根據HTTP動詞和操作方法參數選擇操作方法。在第二種情況下,您有兩個可以處理GET的操作方法,每個方法都有一個參數。當Web API嘗試爲您的GET查找操作方法(更多信息here)時,它會找到這兩種方法。

如果您必須具有這些操作方法,則可以遵循RPC樣式的URI。像這樣在WebApiConfig.cs中添加映射。

public static void Register(HttpConfiguration config) 
{ 
    config.Routes.MapHttpRoute(
     name: "RpcStyle", 
     routeTemplate: "api/{controller}/{action}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

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

然後,使用像下面這樣的操作方法對URI進行GET:http://localhost:port/api/usage/getmilk?a=1&b=2

順便說一下,您的操作方法將無法將查詢字符串默認綁定到複雜類型。使用FromUri這樣的屬性:public int GetMilk([FromUri]MilkVM vm)。 GET請求不能有請求體,因此默認情況下不會綁定複雜類型。

+0

這對我不起作用。通常情況下,我會按照你的建議去做。然而,在這種特殊情況下,我試圖重構一個明顯從未使用過WebAPI的個人的應用程序。因此,客戶希望在控制器中綁定模型(BillingVM,MilkVM),但是我無法更改每個操作的URL,因爲已經寫入的代碼太多依賴於這些端點。 –

相關問題