Asp.net web api MVC Web API路由到错误操作

Asp.net web api MVC Web API路由到错误操作,asp.net-web-api,Asp.net Web Api,我有一个web API控制器,当我调用默认的Get操作时,它可以工作,当我调用另一个特定的操作(GetReservationsForcurstomer)时,它也可以工作,但是一个操作会出现错误(GetReservationsByDate),它似乎会路由到默认的Get操作。代码如下: //获取:api/保留 公共IQueryable GetReservations() { 返回db.预订; } [响应类型(typeof(ReservationDTO))] 公共IHttpActionResult G

我有一个web API控制器,当我调用默认的Get操作时,它可以工作,当我调用另一个特定的操作(GetReservationsForcurstomer)时,它也可以工作,但是一个操作会出现错误(GetReservationsByDate),它似乎会路由到默认的Get操作。代码如下:

//获取:api/保留
公共IQueryable GetReservations()
{
返回db.预订;
}
[响应类型(typeof(ReservationDTO))]
公共IHttpActionResult GetReservationsForCustomer(int CustomerId)
{
IEnumerable reservations=db.reservations.Where(r=>r.CustomerId==CustomerId.ToList();
List reservationList=新列表();
foreach(预订中的预订)
{
reservationList.Add(新建ReservationDTO
{
id=reservation.id,
ReservationStart=reservation.ReservationStart,
封面=预订。封面
});
}
返回Ok(reservationList);
}
[响应类型(类型(ListReservationDTO))]
公共IHttpActionResult GetReservationsByDate(日期时间开始日期、日期时间结束日期)
{
IEnumerable reservations=新列表();
如果(EndDate!=null)
{
reservations=db.reservations.Where(r=>r.ReservationStart.Date>=StartDate.Date&&r.ReservationStart.Date>=EndDate.Date).ToList();
}
其他的
{
reservations=db.reservations.Where(r=>r.ReservationStart.Date==StartDate.Date).ToList();
}
List reservationList=新列表();
foreach(预订中的预订资源)
{
reservationList.Add(新建ReservationDTO
{
id=res.id,
ReservationStart=res.ReservationStart,
封面=实物封面,
CustomerEmail=res.Customer.EmailAddress,
CustomerName=res.Customer.Name,
CustomerPhone=res.Customer.PhoneNumber
});
}
返回Ok(reservationList);
}
以下是我的API调用:

以下是回应:

{
“消息”:“请求无效。”,
“MessageDetail”:“参数字典包含“GreenLionBookings.API.ReservationsController”中方法“System.Web.Http.IHttpActionResult GetReservation(Int32)”的不可空类型“System.Int32”的参数“id”的空项。可选参数必须是引用类型、可空类型或声明为可选参数。”
}
请注意行动的细节在这个阶段是不相关的,为了让它工作,我已经做了相当多的尝试!我尝试过指定开始日期和结束日期,但两种方法都不起作用。它似乎总是被路由到默认的get操作

这是我的路线图:

公共类路由图
{
公共静态无效注册表项(路由收集路由)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
名称:“默认”,
url:“{controller}/{action}/{id}”,
默认值:新建{controller=“Home”,action=“Index”,id=UrlParameter.Optional}
);
}
}
这是我的网站配置:

公共静态无效寄存器(HttpConfiguration配置)
{
//Web API配置和服务
//将Web API配置为仅使用承载令牌身份验证。
config.SuppressDefaultHostAuthentication();
添加(新的HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
//Web API路由
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
}
所以两者基本上都是违约

为什么这不是正确的行动路线,只针对这一个而不是其他?我有另一个控制器(客户),它似乎也能正确地执行所有操作。我读过和,而且我真的认为这很相关,很有帮助,但没有解决我的问题


我做错什么了?

首先,日期里有一个打字机

2018-03-04:T12:30:00
应为
2018-03-04T12:30:00

然后,为了解决路由问题,您可以省略url的操作名称,让框架根据参数名称匹配请求

像这样试试

api/Reservations?StartDate=2018-03-04T12:30:00&EndDate=2018-03-05T12:30:00 
然后,如果希望能够将可为空的值发送到EndDate,EndDate是DateTime的值类型;使日期时间为空

[ResponseType(typeof(ListReservationDTO))]
public IHttpActionResult GetReservationsByDate(DateTime StartDate, DateTime? EndDate)

请注意,
DateTime?
Nullable

endDate
的缩写,它是一个不带默认值的必需参数。因此,该操作不是匹配路由的候选操作,因此选择了默认路由。由于
id
没有值,该操作随后失败。您应该省去url的操作名称,让框架将请求与参数名称匹配,这样做看起来您在日期中有一个typeo,2018-03-04:T12:30:00应该是2018-03-04T12:30:00@MattGNP那么,我应该把这个作为一个答案吗?@MarcusHöglund是的,我会标记为接受。干杯