【问题标题】:API routing 404 if optional parameter missed如果缺少可选参数,API 路由 404
【发布时间】:2014-04-13 02:13:50
【问题描述】:

我在我的 WebApiConfig 中设置了此路由

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

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

        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

        GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    }

和/Api/ProductController.cs里面的这些方法

    public object GetProduct(int id)
    {
        var productRepo = new ProductRepository(db);
        var product = productRepo.GetItem(id);
        return product.ToAnonymousType();
    }

    public object GetTest()
    {
        var productRepo = new ProductRepository(this.db);
        var product = productRepo.GetItem(10000);
        return product.ToAnonymousType();
    }

我可以请求 /api/product/getproduct/10000 并取回 JSON。

如果我请求 /api/product/gettest 我得到一个 404

如果我将 gettest 更改为

public object GetTest(int id)

并请求 /api/product/gettest/10000 我得到 JSON。

我不知道为什么会发生 404。我有其他控制器(用于非 api 请求)正常处理请求。经过几年的网络表单,我是 MVC 的新手,这让我很难过。作为参考,这是我的 RouteConfig

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

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

还有我的 Application_Start

    protected void Application_Start()
    {
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5


    【解决方案1】:

    这是由于您的路线排序造成的。

    RouteConfig.RegisterRoutes(RouteTable.Routes);
    

    之前调用
    GlobalConfiguration.Configure(WebApiConfig.Register);
    

    并且您的 RegisterRoutes 方法包含一个默认(并且非常通用)路由

    url: "{controller}/{action}/{id}"
    

    此通用(默认)规则将匹配您的 url 模式

    api/product/gettest
    

    在您的 WebAPI 路由有机会匹配它之前。

    如果不需要,您可以摆脱该超级通用路由(并使用更具体的路由),或者简单地将调用移至

    GlobalConfiguration.Configure(WebApiConfig.Register);
    

    来电之前来

    RouteConfig.RegisterRoutes(RouteTable.Routes);
    

    在您的 Global.asax 中。

    我使用您提供的所有信息构建了一个示例,并且移动该调用效果很好。 我希望这会有所帮助。

    【讨论】:

    • 没问题!很高兴能提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 2019-07-24
    • 2017-02-27
    • 2021-09-02
    • 1970-01-01
    • 2021-09-19
    • 2019-01-09
    相关资源
    最近更新 更多