【发布时间】:2015-01-12 14:00:29
【问题描述】:
使用 Web API 2.2,假设我想从 HttpContent 读取两次,每次都是不同的类型。
await httpContent.LoadIntoBufferAsync(); //necessary to buffer content for multiple reads
var X = await httpContent.ReadAsAsync<T>(); //read as first type
var Y = await httpContent.ReadAsAsync<Dictionary<string, object>>(); //read as second type
当我运行上面的代码时,X 是 T 的非空实例,而 Y 是空的。如果我切换顺序,Y 将是一个非空字典,而 X 将是空的。换句话说,对ReadAsAsync 的第二次和后续调用将始终返回 null,除非它们使用相同的泛型类型参数调用。独立地,对ReadAsAsync 的调用都按预期工作(即使在不必要地调用LoadIntoBufferAsync 时)。
这出乎我的意料——似乎我应该能够根据需要多次读取不同类型的缓冲内容。如果我添加另一行:
var Z = await httpContent.ReadAsString();
结果是Z 将是一个非空字符串,无论分配给X, Y, Z 的顺序如何。
那么为什么会发生这种情况,为什么我不能使用具有多种类型的ReadAsAsync 从HttpContent 读取?
【问题讨论】:
-
注意:您可能想知道我为什么要这样做。我正在尝试制定一种简单的方法来确定哪些属性最终绑定到
T,以便在Web API 中实现部分更新/PATCH。第二轮阅读字典给了我一个键(属性名)列表,用提交的数据覆盖。我知道 ODataDelta<T>类,但不幸的是它在 OData 控制器之外似乎无法正常工作。 stackoverflow.com/questions/15561874/…
标签: c# .net asp.net-web-api