Asp.Net WebApi路由404.控制器成为" Api"

时间:2015-02-19 15:46:49

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

我正在尝试使用:api / error / LogJsError和一些formdatacollection达到特定的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路由不使用?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

在Application_Start()中,使用:

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