user3320502
user3320502

Reputation: 41

Correctly crafting routes for asp.net web api

I am struggling to correctly design a DELETE http request in my ASP Web application.

I have the following route defined:

    public const string ControllerOnly = "ApiControllerOnly";
    public const string ControllerAndId = "ApiControllerAndIntegerId";
    private const string ControllerAction = "ApiControllerAction";

    public static void Register(HttpConfiguration config)
    {
        var routes = config.Routes;
        // api/projects
        routes.MapHttpRoute(
            name: ControllerOnly,
            routeTemplate: "api/{controller}"
        );

        //api/projects/1
        routes.MapHttpRoute(
            name: ControllerAndId,
            routeTemplate: "api/{controller}/{id}",

            defaults: null,
            constraints: new { id = @"^\d+$" } // id must be all digits
        );

       routes.MapHttpRoute(
            name: ControllerAction,
            routeTemplate: "api/{controller}/{action}"
        );
   }

I am expecting it to hit the following action:

public HttpResponseMessage Delete(int i)
{
    //content remove for brevity
    return new HttpResponseMessage(HttpStatusCode.NoContent);
}

In fiddler I try to test using the following: DELETE http://localhost:port/api/controller/1

but that method never gets hit. Instead, the following method is hit:

public HttpResponseMessage Delete()
{
    //content remove for brevity
    return new HttpResponseMessage(HttpStatusCode.NoContent);
}

I have a basic understanding of routing but shouldn't that only route I defined ensured that the previous test is successful? Note that I have no problem with GET and POST verbs

Any help appreciated

Upvotes: 0

Views: 136

Answers (2)

Lokanadham
Lokanadham

Reputation: 21

Add/Register other route-path before default route. It takes always first prior one. So, in your case you need to register one more path in WebApiConfig as below.

routes.MapHttpRoute(
    name: "WithActionApi", 
    routeTemplate: "api/{controller}/{action}/{Id}", 
                   defaults: new { Id = RouteParameter.Optional 
});

Note : You must register this route before your default route. i.e, It should be as below.

public static void Register(HttpConfiguration config)
{
    routes.MapHttpRoute(
       name: "WithActionApi", 
       routeTemplate: "api/{controller}/{action}/{Id}", 
                      defaults: new { Id = RouteParameter.Optional 
    });
    routes.MapHttpRoute(
       name: ControllerAndId,
       routeTemplate: "api/{controller}/{id}", 
       defaults: null,
       constraints: new { id = @"^\d+$" } // id must be all digits
    );
}

Upvotes: 1

Neel
Neel

Reputation: 11721

I guess you need to add the action part in your route as below :-

routes.MapHttpRoute(
    name: ControllerAndId,
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: null,
    constraints: new { id = @"^\d+$" } // id must be all digits);

Upvotes: 1

Related Questions