2015-02-02 1 views
0

Я пытаюсь правильно спроектировать DELETE-запрос http в своем веб-приложении ASP.Правильно составление маршрутов для asp.net web api

Я следующий маршрут определяется:

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

Я ожидаю его ударить следующие действия:

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

В стельку я пытаюсь проверить с помощью следующих действий: DELETE http://localhost:port/api/controller/1

, но этот метод никогда не попадает. Вместо этого следующий метод попал:

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

У меня есть общее представление о маршрутизации, но не следует, что единственный путь, я определил, гарантировал, что предыдущий тест прошел успешно? Обратите внимание, что у меня нет никаких проблем с GET и POST глаголов

Любая помощь оценили

+0

Есть ли у вас какие-либо другие маршруты? Если да, добавьте их в свой пост. – Complexity

+0

Да, я обычно это делаю, но, столкнувшись с этой проблемой, я прокомментировал их, чтобы сначала сделать эту работу. thx – user3320502

+0

И почему в вашем маршруте нет действий? Частная причина? – Complexity

ответ

1

Я думаю, вам нужно добавить часть действий в маршруте, как показано ниже: -

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

. Посмотрите мое обновление. спасибо – user3320502

+0

поместите свой маршрут до маршрута по умолчанию @ user3320502 – Neel

+0

Это не помогает :(thx – user3320502

1

Добавить/Регистрация другое маршрут до маршрута по умолчанию. Он берет всегда первый предшествующий. Итак, в вашем случае вам нужно зарегистрировать еще один путь в WebApiConfig, как показано ниже.

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

Примечание: Вы должны зарегистрировать этот маршрут до вашего маршрута по умолчанию. i.e, должно быть, как показано ниже.

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

Извините, что определение всего маршрута теперь предоставляется точно в том порядке, о котором вы упомянули. Но все равно ничего не получаю. – user3320502

+0

Можете ли вы поместить свой первый маршрут в конце метода. Ваш WebApi принимает его как маршрут по умолчанию. – Lokanadham

+0

Да, я подумал об этом, хотя я чувствовал, что поставил их в правильном порядке. Но просто чтобы проверить, что я удалил все остальные маршруты, и он по-прежнему вел себя так же, попав в беспараметрический метод. спасибо – user3320502

Смежные вопросы