2013-03-12 1 views
1

Я пытаюсь использовать веб-API и веб-приложение бок о бок и некоторые проблемы с маршрутизацией веб-API.ASP.MVC проблемы с веб-api routing

Это маршрут конфигурации:

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

// Map this rule first 
     config.Routes.MapHttpRoute(
      name: "WithActionApi", 
      routeTemplate: "api/{controller}/{action}/" 
     ); 

     //sets up the API route 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/" 
      //,defaults: new { id = RouteParameter.Optional } 
     ); 

Он отлично работает для веб-приложение и работает отлично подходит для веб-API, который включает в себя только/API/контроллер, но не работает нормально, если я вызываю/API/Controll/действие

Я использую:

[HttpPost] 
    [ActionName("ConfirmRequest")] 
    public HttpResponseMessage ConfirmRequest(string guid, string type, PartiStatus status = PartiStatus.Yes) 

Чтобы указать глагол действия и имя. Я попробовал отладчик маршрута (который не работает в веб-api) и другой, который делает (и выходит из строя) и не смог заставить действие POST работать.

Я закончил тем, что изменил эти действия на GET, и он отлично работает, я думаю, что параметры GET помогают структуре понять это.

Я все еще не уверен, как заставить его работать должным образом. (без сопоставления индивидуальности действиям)

ответ

0

Убедитесь, что вы действительно отправляете запрос POST на указанный URL. Кажется, что ваша маршрутизация верна, и, хотя вы упомянули, что она работает, если вы измените свой атрибут [HttpPost] на [HttpGet], вы не указали на изменение своего запроса.

Если вы отправляете запрос GET URL-адресу для действия ConfirmRequest, и его единственная перегрузка украшена атрибутом [HttpPost], запрос не будет сопоставлен с этим действием.

В большинстве браузеров есть профилировщик, который позволит вам подробно изучить ваш HTTP-запрос (например, Chrome's Network Panel). Если запрос не поступает из браузера, вы можете попробовать автономный профайлер, например Fiddler.

+0

Спасибо! Я использую Get when [HttpGet] и публикую, когда [HttpPost] и используя скрипач, чтобы проверить и отправить сообщение/получить. –

+0

И маршрутизация все еще работает неправильно? Какой результат вы делаете? –

1

Из моего опыта использования веб-API и маршрутизации лучше всего поместить действие по умолчанию внизу. Я также удаляю «catch all» и имею по умолчанию для каждого контроллера для базовых глаголов GET/PUT/POST/DELETE.

Попробуйте что-то вроде этого

config.Routes.MapHttpRoute(
     name: "WithActionApi", 
     routeTemplate: "api/Target/ConfirmRequest/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

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

Вашего образец вызова будет выглядеть как этот

POST api/Target/ConfirmRequest?guid={guid}&type={type}&status{status} 

Там очень маленький удобный Chrome добавить в который я использую в сочетании с Fiddler при быстром тестировании REST вызовов API , Почтальон. Он позволяет сохранять URL-адреса и несколько сред для быстрой отладки.