如果错过了可选参数,则API路由404

时间:2014-04-11 11:05:58

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

我在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)

和request / 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);
    }

1 个答案:

答案 0 :(得分:2)

这是由于您的路线排序。

RouteConfig.RegisterRoutes(RouteTable.Routes);

之前调用

GlobalConfiguration.Configure(WebApiConfig.Register);

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

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

此通用(默认)规则将匹配您的网址格式

api/product/gettest
在您的WebAPI路线有机会匹配之前

如果不需要(并使用更具体的路线),您可以摆脱超级通用路线,或者只是将呼叫转移到

GlobalConfiguration.Configure(WebApiConfig.Register);

来电话之前

RouteConfig.RegisterRoutes(RouteTable.Routes);
在你的Global.asax中

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