Overlord Web API控制器操作不适用于viewmodels?

时间:2013-06-29 02:01:23

标签: asp.net-mvc asp.net-web-api wcf-web-api asp.net-web-api-routing

以下作品:

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

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

但是下面会抛出“找到与请求匹配的多个操作”Exception?!?!

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

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

我该如何解决这个问题?

1 个答案:

答案 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请求必须没有请求体,因此默认情况下不会绑定复杂类型。