В WebAPI тело запроса (HttpContent) можно прочитать только один раз, не кэшировать и читать только вперёд.
Например:
1. Адрес запроса: /?id=123&name=bob
Серверный метод: void Action(int id, имя строки) // Все параметры — простые типы, поэтому все они будут взяты из url
2. Адрес запроса: /?id=123&name=bob
Серверный метод: void Action([FromUri] int id, [FromUri] string name) // То же, что и выше
имя строки void Action([FromBody]); Атрибут [FormBody] показывает, что всё тело читается как строка в виде аргумента
3. Адрес запроса: /?id=123
Определение класса:
публичный класс Customer { // Определен сложный тип объекта public string Name { get; декорация; } public int Age { get; декорация; }
}
Серверный метод: void Action(int id, Customer c) // Идентификатор параметра считывается из строки запроса, параметр c — сложный класс объектов Customer, считываемый от тела через formatter
Серверный метод: void action (Клиент c1, Клиент c2) // Ошибка! Множественные параметры — сложные типы, и все они пытаются читать с одного тела, которое можно прочитать только один раз
Серверный метод: void action([FromUri] Клиент c1, Клиент c2) // Да! В отличие от действия выше, сложный тип C1 будет читаться по URL, а C2 — по телу
4. Метод ModelBinder:
void Action([ModelBinder(MyCustomBinder)] SomeType c) // Указывает, что для разрешения параметра используется определённый связующий модуль
[ModelBinder(MyCustomBinder)] публичный класс SomeType { } // Примените это правило ко всем параметрам типа SomeType, объявив атрибут [ModelBidner(MyCustomBinder)] конкретному типу SomeType
void Action (SomeType c) // Поскольку тип c — SomeType, характеристики SomeType применяются для определения его связывания с моделью
Сводка:
1. Стандартные простые параметры передаются через параметры URL, с исключениями:
1.1 Если маршрут содержит параметр id, параметр id передаётся через маршрут;
1.2 Если параметр помечен как [FromBody], параметр может быть простым параметром, и клиент может передать его через POST: $.ajax(url, '=value') или $.ajax({url: url, data: {'': 'value'}});
2. Стандартные комплексные параметры (пользовательские классы сущностей) передаются через POST, с исключениями:
2.1 Если значение параметра помечено как [FromUri], параметр может быть комплексным параметром;
3. Параметр с пометкой [FromBody] может появляться только один раз, параметр, помеченный как [FromUri], может появляться несколько раз, и если параметр, помеченный как [FromUri], является простым параметром, тег можно удалить. |