gpt4 book ai didi

c# - 给定一个 HttpResponseMessage,我如何读取请求的内容?

转载 作者:太空狗 更新时间:2023-10-30 00:31:02 34 4
gpt4 key购买 nike

给定一个 System.Net.Http.HttpResponseMessage,我可以通过 response.RequestMessage 获得很多关于我发出的请求的信息,例如

response.RequestMessage.RequestUri // the url of the request
response.RequestMessage.Method // the HTTP method

但是,我想不出办法从中获取有用的东西

response.RequestMessage.Content    // a StringContent instance

我查看了 StringContent 的属性树,但我不知道如何以在监 window 口中工作的方式将其内容作为常规字符串获取。

有什么建议吗?

最佳答案

正在分析 System.Net.Http.dll v2.2.29.0ILSpy显示 System.Net.Http.HttpClientHandler.CreateResponseMessage(初始化 HttpResponse 对象)不对相应的 HttpRequest 执行任何操作.内容。这意味着如果它一开始就不是 nullcontent 对象本身 应该仍然可用。

System.ObjectDisposedException “当对处置对象执行操作时”抛出。“处置对象”是什么意思? System.Net.Http.StringContent 结果是通过其祖先 System.Net.Http.HttpContent 实现了 System.IDisposable。所以,它实际上意味着 “一个 IDisposable 在它的 .Dispose() 方法被调用之后。”

自然地,搜索 HttpContent.Dispose() 用户会将我们带到罪魁祸首 - System.Net.Http.HttpClient.SendAsync() 在发送数据后调用 System.Net.Http.HttpClient.DisposeRequestContent()


现在,关于该怎么做。 HttpContent.Dispose() 所做的只是关闭对象的流并设置一个标志。但是,StreamContent(或者更确切地说,它的父级 ByteArrayContent)将数据保存在 .content 字段中 - 这是'被这种性格所感动!

唉,直接读取它的两个方法都是protected,所有使用这些方法的公共(public)方法都首先检查标志。 因此,阅读它的唯一方法是反射(reflection)(插图在 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)

关于c# - 给定一个 HttpResponseMessage,我如何读取请求的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30643994/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com