C# 未找到与请求URI-Web API+;匹配的HTTP资源;有棱角的

C# 未找到与请求URI-Web API+;匹配的HTTP资源;有棱角的,c#,angularjs,datetime,asp.net-web-api,routing,C#,Angularjs,Datetime,Asp.net Web Api,Routing,当我试图从Web API获取一些带有参数(typeDateTime)的数据时,我得到的响应是404错误: 信息 : “未找到与请求URI‘2017年1月31日16:00:00 GMT+0100’匹配的HTTP资源。” 消息详细信息 : “未找到提供控制器名称的路由与请求URI‘2017年1月31日16:00:00 GMT+0100’匹配” 我用AngularJS来做这个。在其他控制器中,我有带参数的方法,但没有DateTime。这可能是个问题吗?在此之前,我犯了一个错误 400错误请求 配置路由

当我试图从Web API获取一些带有参数(type
DateTime
)的数据时,我得到的响应是404错误:

信息 : “未找到与请求URI‘2017年1月31日16:00:00 GMT+0100’匹配的HTTP资源。” 消息详细信息 : “未找到提供控制器名称的路由与请求URI‘2017年1月31日16:00:00 GMT+0100’匹配”

我用AngularJS来做这个。在其他控制器中,我有带参数的方法,但没有DateTime。这可能是个问题吗?在此之前,我犯了一个错误

400错误请求

配置路由对我很有帮助

这都是我在控制器中的代码方法:

[HttpGet]
[ActionName("GetReservationByDate")]
[ResponseType(typeof(Reservation))]
public IHttpActionResult GetReservationByDate(DateTime date)
{
    var reservation = db.Reservations.Where(d => d.Date.Equals(date));
    if (reservation == null)
    {
        return NotFound();
    }
    return Ok(reservation);
}
RouteConfig.cs:

config.Routes.MapHttpRoute(
    name: "CustomApi",
    routeTemplate: "api/Reservations/GetReservationByDate/{date}",
    defaults: new { date = RouteParameter.Optional}
);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
AngularJS的方法和步骤:

this.GetReservation = function (date) {
    var promise = $http({
        method: 'GET',
        url: 'api/reservations/GetReservationByDate?date=' + date,
        config: {
            params: {
                "date": date
            }
        }
    })
    .then(function (response) {
        return response;
    },
    function (response) {
        return response;
    });
    return promise;
}

我尝试了不同的组合,使用
FromUri
FromBody
,但结果总是一样的。

您需要设置控制器和操作的默认值,因为路由模板中不包含模板参数

config.Routes.MapHttpRoute(
    name: "CustomApi",
    routeTemplate: "api/Reservations/GetReservationByDate/{date}",
    defaults: new { controller = "Reservations", action = "GetReservationByDate", date = RouteParameter.Optional}
);
更新操作以允许坏数据

[HttpGet]
[ActionName("GetReservationByDate")]
[ResponseType(typeof(Reservation))]
public IHttpActionResult GetReservationByDate(DateTime? date) {    
    if(date.HasValue) {
        var reservation = db.Reservations.Where(d => d.Value.Date.Equals(date)).ToList();
        if (reservation.Count == 0) {
            return NotFound();
        }
        return Ok(reservation);
    }
    return BadRequest();
}
另外,请尝试格式化日期客户端,以确保以正确的格式发送

this.GetReservation = function (date) {
    var jsonDate = date.toJSON();
    var promise = $http({
        method: 'GET',
        url: 'api/reservations/GetReservationByDate?date=' + jsonDate,
        config: {
            params: {
                "date": jsonDate
            }
        }
    })
    .then(function (response) {
        return response;
    },
    function (response) {
        return response;
    });
    return promise;
}

我这样更改了它,但随后显示错误400错误请求:消息:“请求无效。”消息详细信息:“参数字典包含方法”System.Web.Http.IHttpActionResult GetReservationByDate(System.DateTime)的不可空类型“System.DateTime”的参数“date”的空条目“在”ServiceSchedule.Controllers.ReservationsController“中”。可选参数必须是引用类型、可为null的类型,或者声明为可选参数。“正确。”。我知道那是什么意思。由于date参数是可选的,这意味着可能无法提供日期(因此为null),但操作中的参数不可为null,因为它是DateTime。按照异常消息
中的说明操作,可选参数必须是引用类型、可为空类型或声明为可选参数。
解决方案是什么?更改参数的类型..?如果将类型更改为可为空的日期时间,则它应该可以工作。javascript中的日期格式可能与.NET DateTime不兼容。如果您是在javascript中创建日期,那么您可以尝试接受日期参数作为字符串。然后尝试DateTime.Parse将其转换为c#DateTime,然后再将其传递给LINQ查询