我在我的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请求),它是正常处理请求的。经过多年的Webforms,我是MVC的新手,这让我难过。供参考,这是我的ruteconfig

    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);
    }
.

有帮助吗?

解决方案

这是由于路线的排序。

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中。

我用你给出的所有信息建立了一个样本,并将呼叫转移工作得很好。 我希望这有助于帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top