【问题标题】:Asp.Net WebApi Routing 404. Controller becomes "Api"Asp.Net WebApi 路由 404。控制器变为“Api”
【发布时间】:2015-04-21 01:11:22
【问题描述】:

我正在尝试使用带有一些 formdatacollection 的 api/error/LogJsError 来实现特定的 webapi 操作。我有一个这样的 ErrorController:

public class ErrorController : ApiController
{
    [System.Web.Http.HttpPost]
    public void LogJsError(FormDataCollection form)
    {
        var s = form.Aggregate("Javascript error: message", (current, i) => current + (": " + i.Value));
        new Logger(HttpContext.Current).LogException(new Exception(s));
    }
}

并且路由是这样配置的:

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

在WebApiConfig.Register 和

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

在 RouteConfig.RegisterRoutes 中

但是无论我做什么,routecollection 都会返回 controller = "Api",从而导致 404。我做错了什么,为什么没有使用 api 路由?

【问题讨论】:

    标签: asp.net asp.net-web-api routing


    【解决方案1】:

    Duuuh...我在发布后立即找到了答案:https://msdn.microsoft.com/en-us/library/cc668201%28v=vs.140%29.aspx

    注意这一点:“为避免让错误的处理程序处理请求,在定义路由时必须考虑所有这些条件。Route 对象出现在 Routes 集合中的顺序很重要。从第一个路由开始尝试路由匹配到集合中的最后一个路由。发生匹配时,不再评估路由。通常,将路由添加到 Routes 属性中,按照从最具体的路由定义到最不具体的路由定义的顺序。"

    我的 MVC 路由(例如:{controller}/{action}/{id})在(更具体的)WebApi 路由(例如:api/{controller}/{action}/{id})之前添加到 routecollection )。所以不要使用:

    RouteConfig.RegisterRoutes(RouteTable.Routes);
    GlobalConfiguration.Configure(WebApiConfig.Register);
    

    在 Application_Start() 中,使用:

    GlobalConfiguration.Configure(WebApiConfig.Register);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-12
      • 2018-02-20
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多