分析System.Net.Http.dll v2.2.29.0 https://api.nuget.org/packages/microsoft.net.http.2.2.29.nupkg with ILSpy http://ilspy.net/表明System.Net.Http.HttpClientHandler.CreateResponseMessage
(初始化一个HttpResponse
对象)不会对相应的对象执行任何操作HttpRequest
's .Content
。这意味着如果不是null
首先,内容对象本身应该仍然可用。
System.ObjectDisposedException https://msdn.microsoft.com/ru-ru/library/system.objectdisposedexception%28v=vs.100%29.aspx被抛出“当对已处理的对象执行操作时。”“处置对象”是什么意思?System.Net.Http.StringContent
事实证明实施System.IDisposable
通过它的祖先,System.Net.Http.HttpContent
。
所以,它实际上意味着"an IDisposable
在其之后.Dispose()
方法被调用。”
自然而然地寻找HttpContent.Dispose()
用户带我们去罪魁祸首——System.Net.Http.HttpClient.SendAsync()
那个叫System.Net.Http.HttpClient.DisposeRequestContent()
发送数据后。
现在,关于该怎么做。所有这些HttpContent.Dispose()
所做的就是关闭对象的流并设置一个标志。然而,StreamContent
(或者更确切地说是它的父级,ByteArrayContent
) 将数据保存在.content
field——这不受影响的性格!
唉,直接读取的两种方法都是protected
,以及所有使用这些方法的公共方法首先检查标志。所以,阅读它的唯一方法就是反思(插图是在 IronPython 中,注释是针对 C# 等效项给出的):
>>> sc=System.Net.Http.StringContent("abcdefghijklmnopqrstuvwxyz")
#in C#, the following is `type(StringContent)' (this is what it actually does)
>>> scd=System.Reflection.TypeDelegator(System.Net.Http.StringContent)
>>> print scd.GetField("content",System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Instance)
None #because the field is in ByteArrayContent and is private
>>> bacd=System.Reflection.TypeDelegator(System.Net.Http.ByteArrayContent)
>>> bacd.GetField("content",System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Instance)
<System.Reflection.RtFieldInfo object at 0x000000000000002C [Byte[] content]>
# `_' is last result
>>> _.GetValue(sc)
Array[Byte]((<System.Byte object at 0x000000000000002D [97]>, <System.Byte objec
t at 0x000000000000002E [98]>, <System.Byte object at 0x000000000000002F [99]>,
<...>
在 C# 中,这看起来像:
type(ByteArrayContent)
.GetField("content",BindingFlags.NonPublic|BindingFlags.Instance)
.GetValue(content)