Почему MVC 4 Web API соответствует параметрам действия из тела запроса GET? - PullRequest
3 голосов
/ 06 марта 2012

У меня есть метод 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".

Это ошибка, или я что-то упустил?

1 Ответ

3 голосов
/ 08 июня 2012

asp.net mvc использует ValueProviderFactories для извлечения значений из запроса на привязку модели. Вы можете увидеть настроенных поставщиков, проверив ValueProviderFactories.Factories Свойство . В конфигурации по умолчанию эта коллекция состоит из

  1. ChildActionValueProviderFactory
  2. FormValueProviderFactory
  3. JsonValueProviderFactory
  4. RouteDataValueProviderFactory
  5. QueryStringValueProviderFactory
  6. HttpFileCollectionValueProviderFactory

Эта коллекция отсортирована, и, поскольку JsonValueProviderFactory отображается выше в списке, она используется в качестве поставщика значения для id, а не RouteDataValueProviderFactory.

...