0

我对 WebApi 很陌生,不了解参数映射。我有一个带有 2 个参数的 HttpGet 方法的控制器。在 WebApiConfig 映射中定义如下

config.Routes.MapHttpRoute(
                name: "MyActionApi",
                routeTemplate: "api/{controller}/{action}/{p},{q}");

这似乎工作正常。

以此类推,我添加了另一个具有 3 个参数 HttpGet 方法的控制器 (DetailsController)。

我已经添加

config.Routes.MapHttpRoute(
                name: "MyActionApi2",
                routeTemplate: "api/{controller}/{action}/{p},{q},{r}");

但是导航到

http://mysite/api/Details/CrossReport/12,14,Peter

给出 404 错误并说

在与请求匹配的控制器“详细信息”上未找到任何操作。

但是像这样导航

http://mysite/api/Details/FilterByDate/12,14?q=10

给出正确的结果。

这是为什么?我想像第一种情况一样用逗号分隔。为什么它在第一种情况下有效,而在第二种情况下无效?

工作控制器的方法:

public IEnumerable<Order> FilterByDate(DateTime dateStart, DateTime dateEnd).

不工作:

public IEnumerable<Detail> FilterByDate(DateTime dateStart, DateTime dateEnd, int maxCount)

两者都有 HttpGet 属性。

4

3 回答 3

1

您需要定义一个匹配的操作。尝试在您的 DetailsController 类上添加具有以下签名的操作:

[HttpGet]
public IEnumerable<Detail> CrossReport(string p, string q, string r)

如您所见,操作名称和参数名称必须与您的路线上的名称相匹配。

于 2013-01-15T18:13:48.103 回答
1

想一想,您是否确保在路由配置中 MyActionApi2 在 MyActionApi 之前?如果我没记错的话,它会寻找第一个可能的匹配......所以 MyActionApi 会匹配(即使有 3 个参数)

于 2014-08-27T17:21:31.090 回答
0

WebApi 中有两种类型的参数:路由中的参数和 body/url 中的参数。

路由中的参数

在这个例子中,id 参数在路由中。

http://mysite/api/Details/CrossReport/{id}

路由参数由“/”分隔,并且有部分路由。

http://mysite/api/Details/CrossReport/{id}/{name}/{detailId}

在您的 web api 控制器中,您必须是:

public IEnumerable<Order> FilterByDate(int id, string name, int detailId)

正文/网址中的参数

url 中的参数由 & 分隔,所有这些参数都在 ? 在路线。例如。

http://mysite/api/Details/CrossReport?id=3&name="john"&detailId=5

并且在您的 web api 控制器中是相同的:

public IEnumerable<Order> FilterByDate(int id, string name, int detailId)

如果对象由其他属性复合:

public class MyObject 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

您只能在消息正文中包含一个,并且您必须在消息正文中发送并且您的 Web api 控制器接收它们:

public IEnumerable<Order> FilterByDate(MyObject obj)
于 2016-10-11T12:00:10.863 回答