【问题标题】:Web API action not found when optional parameter not present in URL当 URL 中不存在可选参数时未找到 Web API 操作
【发布时间】:2014-06-26 05:15:54
【问题描述】:

请帮忙。 我必须更改 Web API 的路由才能使用 URL 中的方法:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // for MVC controllers
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Editions", action = "Index", id = UrlParameter.Optional }
        );

        // for Web API
        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new  {  id = RouteParameter.Optional }
        );

    }
}

我有一个控制器

public class PositionsController : ApiController
{
    [HttpGet]
    public JToken Approved()
    {
        // some code here
    }
}

对于带参数的方法,一切正常,但我不能调用像http://localhost/API/Positions/Approved 这样的无参数方法。我没有调用 Approved 方法,而是得到 404 not found 错误。我做错了什么?

有趣的部分:调用 URL http://localhost/API/Positions/Approved/whatever 有效。看来 ID 并没有我想的那么可选。

感谢您的帮助!

【问题讨论】:

  • 这是您定义的唯一路线还是之前还有其他路线?
  • 我刚刚构建了您的场景,它运行良好。您的应用程序中发生了更多事情。更多路由,或者控制器中的更多内容
  • 你有没有碰巧把路由放到RouteConfig而不是WebApiConfig?它们的工作方式略有不同。
  • 抱歉不清楚。现在我用所有路由配置编辑了我的问题。是的,它在 RouteConfig 中。请@WeTTTT,你能解释更多吗?

标签: asp.net-mvc asp.net-mvc-routing asp.net-mvc-5 asp.net-web-api2


【解决方案1】:

你的问题是第一个路由(MVC)被匹配,而不是你真正想要的路由。

因此,对于像http://localhost/API/Positions/Approved 这样的网址,应用程序正在寻找一个名为“APIController”的控制器,其操作名为“Positions”,字符串参数“id”将设置为“Approved”值。

快速的解决方案是更改路由的声明,以便 API 路由出现在 MVC 路由之前,但是如前所述,我会将路由分成各自的配置(RouteConfig 和 WebApiConfig)并确保在 Global.asax .cs 路由以正确的顺序注册:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

或者,如果您使用 WebApi2,您可以使用属性路由来简化操作。

【讨论】:

  • 是的!这就对了!非常感谢。配置顺序更改成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2018-06-17
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多