0

Я передаю этот URI в мой Web API сервера:Являются ли [FromBody] и [FromUri] взаимоисключающими?

http://localhost:28642/api/InventoryItems/PostInventoryItem?serialNum=8675309e9&ID=147&pksize=2&Description=juanValdes&vendor_id=venderado&UnitCost=2.58&UnitList=3.82&OpenQty=25.70&UPC=12349&dept=139&subdept=89&upc_pack_size=24&vendor_item=popTartz&crv_id=157 

Этот код контроллера (с "[FromBody]" аннотацию) не работает:

public void PostInventoryItem([FromBody] string serialNum, [FromUri] InventoryItem ii) 
{ 
    string serNum = serialNum; 
    _inventoryItemRepository.PostInventoryItem(serNum, 
     ii.ID, ii.pksize, ii.Description, ii.vendor_id, ii.UnitCost, ii.UnitList, ii.OpenQty, 
     ii.UPC, ii.dept, ii.subdept, ii.upc_pack_size, ii.vendor_item, ii.crv_id); 
} 

... (serialNum является ноль); но это (без "[FromBody]" аннотацию) делает:

public void PostInventoryItem(string serialNum, [FromUri] InventoryItem ii) 
{ 
    string serNum = serialNum; 
    _inventoryItemRepository.PostInventoryItem(serNum, 
     ii.ID, ii.pksize, ii.Description, ii.vendor_id, ii.UnitCost, ii.UnitList, ii.OpenQty, 
     ii.UPC, ii.dept, ii.subdept, ii.upc_pack_size, ii.vendor_item, ii.crv_id); 
} 

(serialNum является ожидаемым "8675309e9") Почему? Казалось бы, более конкретная версия будет работать, но, хотя она компилируется, serialNum имеет нулевой первый фрагмент.

Я знаю, что вы не можете использовать два «[FromBody]» аннотаций в одном методе, как отмечалось here, но это тот случай, когда всех других аннотаций запрещены?

ответ

1

В вашей первой реализации

public void PostInventoryItem([FromBody] string serialNum, [FromUri] InventoryItem ii) 

{}

значение serialNum равно нулю, как и следовало ожидать, потому что [FromBody] пытался искать serialNum в теле сообщения.

Это определение атрибута из MSDN:

FromBodyAttribute Класс

Атрибут, который указывает, что параметр действия происходит только от сущность тела входящего HttpRequestMessage.

+0

Хорошо, я был смущен/не думал о теле/​​разделении ури. Я не знаю, что такое «тело», я думаю - как я могу передать что-то (что, я думаю, считается «телом») отдельно от того, что передается в URI? Итак, теперь я задаюсь вопросом, можно ли использовать две аннотации [FromUri]; однако он работает как есть (нет аннотации на serialNum и [FromUri] для класса/объекта, поэтому это не имеет большого значения, мне просто интересно. –

+1

«body» здесь означает тело вашего запроса. По умолчанию связующее будет смотреть на вашу строку запроса, поэтому вам не нужно украшать FromUri, если вы не хотите связывать данные из другого места, как в первом сценарии –

Смежные вопросы