【问题标题】:Web API routing not working properly (action names)Web API 路由无法正常工作(操作名称)
【发布时间】:2015-05-03 12:02:37
【问题描述】:

我得到了以下代码,但我无法让动作名称起作用,还是这里有其他问题?我想创建一个自定义搜索,通常当您在 api 中查找一个对象时,您会搜索 id,但我想搜索例如工作日,但它实际上可以是任何东西。

DayController.cs:

[ActionName("Weekday")]
public IHttpActionResult GetDayWeek(string q_day) {
    var day = controller.GetDay(q_day);
    if (day == null) {
        return NotFound();
    }
    return Ok(day);
}

Controller.cs:

public Day GetDay(string q_day) {
    var day = dal.GetDayByWeekday(q_day);
    return day;
}

Dal.cs:

public Day GetDayByWeekday(string q_day) {
    var day = db.Day.Where(d = > d.Weekday == q_day).Single();
    return day;
}

WebApiConfig.cs:

public static void Register(HttpConfiguration config) {
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new {
        id = RouteParameter.Optional
    });
}

错误:

<Error>
    <Message>
No HTTP resource was found that matches the request URI 'http://localhost:2096/api/Day/Weekday/monday'.
</Message>
    <MessageDetail>
No action was found on the controller 'Day' that matches the request.
</MessageDetail>
</Error>

【问题讨论】:

  • 我不是使用 Web API 的向导 - 但是您是否也尝试将 [HttpPost] 属性添加到方法中?并确保您正在从 javascript 发出后请求?
  • 我想我应该能够通过例如转到“/api/Day/Weekday/monday”来测试没有任何 js 的 api?
  • 是的,只要确保它是 POST 请求而不是 GET/PUT/DELETE 请求
  • 添加了[HttpPost],还是一样的错误
  • 另请注意,由于您的函数参数未调用 Id,因此可能存在映射问题。正确设置路线以捕获您的变量[Route("weekday/{q_day}")]

标签: c# asp.net-web-api


【解决方案1】:

改变这个:

[ActionName("Weekday")]
public IHttpActionResult GetDayWeek(string q_day) {
    var day = controller.GetDay(q_day);
    if (day == null) {
        return NotFound();
    }
    return Ok(day);
}

到这里:

[Route("api/day/weekday/{q_day}")]
public IHttpActionResult GetDayWeek(string q_day) {
    var day = controller.GetDay(q_day);
    if (day == null) {
        return NotFound();
    }
    return Ok(day);
}

在我的测试中成功了

感谢 JLevett 让我查看了 Route 属性

解释一下:

Route 属性会覆盖您尝试调用的方法的路径。因此,它需要是包含参数名称的完整路径。

您是否有一个具有多个参数的方法应该可以工作:

[Route("api/day/weekday/{q_day}/{w_day}")]
public IHttpActionResult GetDayWeekAndMore(string q_day, string w_day) {
...

【讨论】:

    猜你喜欢
    • 2013-09-10
    • 2019-05-08
    • 2021-02-13
    • 1970-01-01
    • 2016-11-26
    • 2014-12-05
    • 2018-01-17
    • 2017-10-15
    相关资源
    最近更新 更多