Веб-API маршрутизации для функций с разными именами?
У меня проблема с маршрутизацией, и я не могу понять, как ее решить.
Есть контроллер с именем "UsersController", и он содержит 2 функции Post action:
public int PostFBLogin(User userObject){}
public void PostUpdateImgUrl(User userObject){}
Когда я делаю запрос POST, я передаю представление JSON "User" в теле запроса. Если я закомментирую одну из этих функций, то она работает нормально. Но когда обе функции существуют, всякий раз, когда я пытаюсь сделать запрос к каждой из них, я получаю следующую ошибку:
"Multiple actions were found that match the request:
Int32 PostFBLogin(MestoryServer.Models.User) on type MestoryServer.Controllers.UsersController
Void PostUpdateImgUrl(MestoryServer.Models.User) on type MestoryServer.Controllers.UsersController"
Я попытался решить ее с помощью размещение следующих маршрутов в таблицах маршрутизации:
RouteTable.Routes.MapHttpRoute(
name: "UserPostUpdateImgUrlAction",
routeTemplate: "api/users/PostUpdateImgUrl/",
defaults: new
{
controller = "users",
action = "PostUpdateImgUrl"
}
);
RouteTable.Routes.MapHttpRoute(
name: "UserPostFBLoginAction",
routeTemplate: "api/users/PostFBLogin/",
defaults: new
{
controller = "users",
action = "PostFBLogin"
}
);
Но это не помогло.
Просмотрев множество сообщений о таблицах маршрутизации в Интернете, я не уверен, что даже возможно иметь два действия, которые имеют одинаковые подписи, но разные имена.
Может ли кто-нибудь помочь?
Спасибо, Электронный обмен данными.
1 ответ:
При выполнении HTTP-запроса с помощью Web API метод HTTP используется для идентификации вызываемого действия. Запрос HTTP Post вызовет метод в ApiController, который начинается с "POST". По соглашению веб-API ожидает (не более) один метод на метод HTTP. Это и есть причина ошибки, которую вы получаете.
Маршрут по умолчанию для Web API не определяет действие:
routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
Вы можете изменить вышеизложенное, чтобы включить действие, например
routeTemplate: "api/{controller}/{action}/{id}"
, но затем вы должны добавить[HttpPost]
выше методов.Или вы можете рассмотреть возможность разделения вашего контроллера Web Api на два. Метод PostFBLogin можно переместить в LoginController, а метод PostUpdateImgUrl-в UsersController.