【问题标题】:No HTTP resource was found that matches the request URI - Web API + Angular未找到与请求 URI 匹配的 HTTP 资源 - Web API + Angular
【发布时间】:2025-11-27 19:35:01
【问题描述】:

当我尝试从 Web API 获取带有参数(类型 DateTime)的一些数据时,我收到错误 404 的响应:

消息 : “未找到与请求 URI 'http://localhost:53544/api/reservations/GetReservationByDate?date=Tue2017 年 1 月 31 日 16:00:00 GMT+0100' 匹配的 HTTP 资源。” 留言详情 : "没有找到提供控制器名称的路由来匹配请求 URI 'http://localhost:53544/api/reservations/GetReservationByDate?date=Tue Jan 31 2017 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;
}

我尝试了不同的组合,FromUriFromBody,但结果总是一样的。

【问题讨论】:

    标签: c# angularjs datetime asp.net-web-api routing


    【解决方案1】:

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

    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 Bad Request: Message : "The request is invalid." MessageDetail:“参数字典包含“ServiceSchedule.Controllers.ReservationsController”中方法“System.Web.Http.IHttpActionResult GetReservationByDate(System.DateTime)”的不可为空类型“System.DateTime”的参数“日期”的空条目. 可选参数必须是引用类型、可空类型或声明为可选参数。"
    • 对。我知道那是什么意思。因为 date 参数是可选的,这意味着可能无法提供日期(因此为 null),但操作中的参数不可为 null,因为它是 DateTime。按照异常消息An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.中的说明进行操作
    • 解决办法是什么?更改参数类型..?
    • 如果您将类型更改为 DateTime? 这是可为空的 DateTime 它应该可以工作。
    • 您的 javascript 中的日期格式可能与 .NET DateTime 不兼容。如果您在 javascript 中创建日期,那么您可以尝试接受日期参数作为字符串。然后尝试 DateTime.Parse 在将其传递给 LINQ 查询之前将其转换为 c# DateTime
    最近更新 更多