Following route:
routes.MapHttpRoute( name: "Set", routeTemplate: "api/set/{id}", defaults: new { controller = "Set", id = RouteParameter.Optional } );
displayed as follows:
[HttpDelete] [AcceptVerbs("DELETE")] public HttpResponseMessage DeleteSet(int id) {
I can delete sets with this call:
DELETE api/set/1

BUT if I remove the above route in favor of attribute routing:
[HttpDelete("api/set/{id}")] [AcceptVerbs("DELETE")] public HttpResponseMessage DeleteSet(int id) {
And add to my configuration:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { var cors = new EnableCorsAttribute("http://localhost:11089", "*", "*"); config.MapHttpAttributeRoutes();
The same request is aborted due to a CORS problem:

In the images you see the query parameter, but this is true for simple DELETE queries with identifier. What the hell is going on? We spent a lot of time matching the attributes, and it would prevail that everything be discarded because DELETE does not work.
Here's another DELETE instance, broken with a simple id:

The above was obtained from this request:
var options = { url: apiEndpoint + 'card/' + id, type: 'DELETE', dataType: 'json', xhrFields: { withCredentials: true } }; return $.ajax(options)
UPDATE If we go over all of our removal methods with " [AcceptVerbs("OPTIONS")] , then it will work. It seems inelegant, and I would like to leave it open if someone has an authoritative answer.