2013-11-08 2 views
1

У меня есть контроллер с двумя методами POST:контроллера с несколькими действиями - неправильное действие называется

[WebInvoke(Method = "POST", UriTemplate = "/api/controller/action1")] 
[ActionName("action1")] 
public HttpResponseMessage MethodA(string s1, string s2); 

[WebInvoke(Method = "POST", UriTemplate = "/api/controller/action2")] 
[ActionName("action2")] 
public HttpResponseMessage MethodB(string s1, InternalClass c); 

Я звоню его из тестового жгута. Когда я пытаюсь выполнить POST по адресу MethodB, используя URL http://localhost/api/controller?s1=<string>, минуя c в теле POST, сообщение указывает, что он пытается вызвать MethodA вместо этого (у меня есть фильтр проверки, который указывает «s1 и s2 - обязательные поля»).

Когда я добавить действие к URL и попытаться POST в MethodB используя http://localhost/api/controller/action2?s1=<string>, проходя c в теле, я получаю 404 вместо.

Я изменил мой RouteConfig использовать эти маршруты:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

routes.MapHttpRoute(
    name: "Name2", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: null, 
    constraints: new { id = @"^\d+$" } // Only integers 
); 

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

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

, как было указано в this question.

Что я делаю неправильно?

ответ

2

Когда я пытаюсь POST к MethodB используя URL http://localhost/api/controller?s1=<string>, проходя с в теле POST, сообщение указывает на то, что он пытается вызвать Methoda вместо (у меня есть фильтр проверки, что указывает на «s1 и s2 являются обязательные поля ").

Похоже, вы пытаетесь полагаться на перегрузку, чтобы устранить неоднозначность ваших маршрутов - MVC не работает так. Вы должны убедиться, что ваши маршруты определены как уникальные, с одним POST и GET за маршрут.

В этом случае метод действия по умолчанию для /api/controller является MethodA, и он пытается заставить объект C в качестве второго параметра MethodA.

Если вы хотите, чтобы по умолчанию было отправлено MethodB, вам необходимо обновить маршрут. Однако, похоже, вы хотите, чтобы он был динамичным и определял маршрут на основе параметров, которые были отправлены, и это не работает.

Кроме того, этот маршрут:

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

выглядит не так, потому что это указывает на Default контроллер, метод Index действия, которые вы не перечислили в вашем коде. Поэтому, отправляясь в api/controller, вы попытаетесь перейти на Default.Index.

И наконец, рассмотрите порядок ваших маршрутов. Когда MVC-трубопровод оценит ваши маршруты, он будет соответствовать первому возможному маршруту. В вашем случае у вас есть более общие маршруты вверху, с более конкретными маршрутами внизу. Вам необходимо изменить порядок, введя более конкретные маршруты вверху. This article говорит об этом.

+0

Так что я не могу устранить двусмысленность, используя действия? –

+0

Да, но не параметры. Использование действий в URL должно работать. Что происходит, если вы жестко кодируете свои маршруты, имея два действия, по одному для каждого метода? Похоже, что у вас что-то еще не так (вне кода, который вы указали), поэтому вам нужно устранить неполадки. –

+0

Теперь я попытаюсь выполнить жесткую кодировку этих маршрутов. Но имеет значение порядок маршрутов?Если бы я переместил «Name3» (с контроллером и действием) выше «Name1» (только с контроллером), будет ли он иметь приоритет? –

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