0

The following works:

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

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

But the following throws a "Multiple actions were found that match the request" Exception?!?!

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

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

How can I fix this?

4

1 回答 1

0

默认情况下,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 进行 GET http://localhost:port/api/usage/getmilk?a=1&b=2

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

于 2013-06-29T03:06:05.923 回答