Веб-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 2

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.