Asp.net mvc 重载WebAPI控制器操作不';不能使用viewmodels?

Asp.net mvc 重载WebAPI控制器操作不';不能使用viewmodels?,asp.net-mvc,asp.net-web-api,wcf-web-api,asp.net-web-api-routing,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; } } 但是下面抛出了一个“找到了与请求匹配的多个操作”

以下工作:

 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;
     }
}

如何修复此问题?

默认情况下,ASP.NET Web API根据HTTP谓词和操作方法参数选择操作方法。在第二种情况下,有两个操作方法可以处理GET,它们各自有一个参数。当Web API试图为GET找到一个操作方法(更多信息)时,它会同时找到这两个方法

如果必须有这样的操作方法,则可以遵循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:
http://localhost:port/api/usage/getmilk?a=1&b=2


顺便说一句,默认情况下,您的操作方法将无法将查询字符串绑定到复杂类型。像这样使用
FromUri
属性:
public int-GetMilk([FromUri]MilkVM)
。GET请求不能有请求正文,因此默认情况下不会绑定复杂类型。

您希望WebAPI如何知道URI中的参数是属于MilkVM还是BillingVM?通过比较每个viewmodel上可用的参数?这对我不起作用。通常,我会照你的建议去做。然而,在这个特殊的例子中,我试图重构一个应用程序,这个应用程序是由一个显然从未使用过WebAPI的人组装而成的。因此,客户机希望在控制器(BillingVM、MilkVM)中进行模型绑定,但我无法更改每个操作的URL,因为依赖于这些端点已经编写了太多代码。