Asp.net web api WebApi参数

Asp.net web api WebApi参数,asp.net-web-api,asp.net-web-api-routing,Asp.net Web Api,Asp.net Web Api Routing,我对WebApi非常陌生,不了解参数映射。 我有一个带有两个参数的HttpGet方法的控制器。在WebApiConfig映射中定义如下 config.Routes.MapHttpRoute( name: "MyActionApi", routeTemplate: "api/{controller}/{action}/{p},{q}"); 这似乎很管用 通过类比,我添加了另一个控制器(DetailsController),它有3个参

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

config.Routes.MapHttpRoute(
                name: "MyActionApi",
                routeTemplate: "api/{controller}/{action}/{p},{q}");
这似乎很管用

通过类比,我添加了另一个控制器(DetailsController),它有3个参数HttpGet方法

我补充说

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 FilterByDate(日期时间日期开始,日期时间日期结束)。
不工作:

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

两者都有HttpGet属性。

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

[HttpGet]
public IEnumerable<Detail> CrossReport(string p, string q, string r)
[HttpGet]
公共IEnumerable交叉报告(字符串p、字符串q、字符串r)

正如您所看到的,操作名称和参数名称必须与路由上的名称相匹配。

一个想法是,您是否确保在路由配置中MyActionApi前面有MyActionApi?如果我没有弄错的话,它会寻找第一个可能的匹配。。。因此MyActionApi将匹配(即使有3个参数)

WebApi中有两种类型的参数:routes中的参数和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)
在您的web api中,控制器是相同的:

public IEnumerable<Order> FilterByDate(int id, string name, int detailId)
消息正文中只能有一个,您必须在消息正文中发送消息,并且您的web api控制器必须接收它们:

public IEnumerable<Order> FilterByDate(MyObject obj)
public IEnumerable FilterByDate(MyObject对象)

请发布您的操作签名请参见编辑后的问题。其中一个示例用于FilterByDate操作,另一个(不起作用)用于crossReport-控制器上的crossReport方法是什么样子的?@Nickolodeon您明白了吗?实际上我明白了(请参见更新后的问题)。但它并没有按照描述的方式工作,即404方式。@Nickolodeon-我在你的帖子中看不到方法交叉报告-你刚刚创建了FilterByDate操作ScrossReport操作签名与FilterByDate完全相同。那么,现在呢?将用于第三个参数。稍后我将阅读更多关于路由的教程,希望以后不会再有这样愚蠢的问题了。感谢大家的参与。
public class MyObject 
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public IEnumerable<Order> FilterByDate(MyObject obj)