Reputation: 41
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
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
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