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上没有注释,而class/object是[FromUri],所以没什么大不了的,我只是主要好奇。 –

+1

这里的“body”意味着你的请求的主体。默认情况下,绑定器将查看您的查询字符串,因此您不需要使用FromUri进行修饰,除非要像第一个场景中那样绑定来自不同位置的数据 –