Boudewijn van Veen
Boudewijn van Veen

Reputation: 427

Asp.Net WebApi Routing 404. Controller becomes "Api"

I am trying to reach a specific webapi action using: api/error/LogJsError with some formdatacollection. I have an ErrorController like this:

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

and the routes are configured like this:

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

In WebApiConfig.Register and

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

inside the RouteConfig.RegisterRoutes

But whatever i do the routecollection returns controller = "Api" which thus results in a 404. What am i doing wrong, why is the api route not uses?

Upvotes: 1

Views: 617

Answers (1)

Boudewijn van Veen
Boudewijn van Veen

Reputation: 427

Duuuh...i found the answer right after posting it on: https://msdn.microsoft.com/en-us/library/cc668201%28v=vs.140%29.aspx

Note this: "To avoid having the wrong handler handle a request, you must consider all these conditions when you define routes. The order in which Route objects appear in the Routes collection is significant. Route matching is tried from the first route to the last route in the collection. When a match occurs, no more routes are evaluated. In general, add routes to the Routes property in order from the most specific route definitions to least specific ones."

My MVC route (eg: {controller}/{action}/{id}) was added to the routecollection before the (more specific) WebApi route (eg: api/{controller}/{action}/{id}). So instead of using:

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

In Application_Start(), use:

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

Upvotes: 1

Related Questions