У меня есть контроллер с двумя методами 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.
Что я делаю неправильно?
Так что я не могу устранить двусмысленность, используя действия? –
Да, но не параметры. Использование действий в URL должно работать. Что происходит, если вы жестко кодируете свои маршруты, имея два действия, по одному для каждого метода? Похоже, что у вас что-то еще не так (вне кода, который вы указали), поэтому вам нужно устранить неполадки. –
Теперь я попытаюсь выполнить жесткую кодировку этих маршрутов. Но имеет значение порядок маршрутов?Если бы я переместил «Name3» (с контроллером и действием) выше «Name1» (только с контроллером), будет ли он иметь приоритет? –