У меня есть метод API, который возвращает объект пользователя путем указания идентификатора пользователя в URL-адресе запроса, как показано ниже:
http://www.myapi.com/users/1
Мой маршрут выглядит так:
routes.MapHttpRoute(
"GetUserByUserId",
"users/{id}",
defaults: new { Controller = "User", Action = "GetUserByUserId" },
constraints: new { httpMethod = new HttpMethodConstraint(new string[] { "GET" })
});
Контроллер называется UserController, а метод называется GetUserByUserId и выглядит следующим образом:
[HttpGet]
public User GetUserByUserId(int id)
{
... returns a User object ....
}
Если я вызываю метод, он отвечает пользовательским объектом, как и ожидалось. Идентификатор «1» в URL-адресе автоматически сопоставляется с маршрутом как атрибут GetUserByUserId «id».
Но (!!), если я случайно предоставлю сериализованный объект JSON любого вида в теле запроса, например:
{"Id":6,"PermissionId":0,"UserId":3}
MVC автоматически сопоставляет свойство «Id» в объекте тела запроса с моим атрибутом «id» метода GetUserByUserId, игнорируя идентификатор «1» в моем URL!
Для меня это выглядит очень странно. Я знаю, что Web API автоматически сопоставляет URL-адрес запроса и тело запроса с соответствующими атрибутами в маршрутизируемом методе, но «Id» в теле запроса в моем примере НЕ является простым автономным целым числом, это свойство в сложном типе и не должен интерпретироваться как атрибут метода "id".
Это ошибка, или я что-то упустил?