Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc API路由404(如果缺少可选参数)_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

Asp.net mvc API路由404(如果缺少可选参数)

Asp.net mvc API路由404(如果缺少可选参数),asp.net-mvc,asp.net-mvc-5,Asp.net Mvc,Asp.net Mvc 5,我已在我的WebApiConfig中设置了此路由 public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{actio

我已在我的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请求)正常处理请求。在使用了几年的webforms之后,我是MVC的新手,这让我很困惑。作为参考,这里是我的路线图

    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 }
        );
    }
我的申请就要开始了

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

这是由于您的路线顺序

RouteConfig.RegisterRoutes(RouteTable.Routes);
以前打过电话吗

GlobalConfiguration.Configure(WebApiConfig.Register);
您的RegisterRoutes方法包含一个默认(非常通用)路由

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

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

如果不需要的话,您可以去掉这个超级通用路由(并使用更具体的路由),或者只需将调用移动到

GlobalConfiguration.Configure(WebApiConfig.Register);
在呼叫之前到达

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

我用你提供的所有信息构建了一个示例,移动那个电话效果很好。
我希望这有帮助。

没问题!很乐意帮忙。
RouteConfig.RegisterRoutes(RouteTable.Routes);