asp.net 已处置HttpRequestMessage内容

wdebmtf2  于 2023-02-26  发布在  .NET
关注(0)|答案(1)|浏览(151)

为了更好地记录和跟踪,我们创建了一个扩展方法,在里面我们正在做一些事情:

if (!httpResponseMessage.IsSuccessStatusCode)
{
    ResponseError error = new ResponseError();
    error.Message = $"Error response status code reported: {(int)httpResponseMessage.StatusCode} - {httpResponseMessage.ReasonPhrase}";
    error.AbsoluteUri = httpResponseMessage.RequestMessage?.RequestUri?.AbsoluteUri;

    if (httpResponseMessage.RequestMessage?.Content != null)
    {
        // here we are getting an ObjectDisposedException, Object name: System.Net.Http.StringContent
        error.RequestContent = await httpResponseMessage.RequestMessage.Content.ReadAsStringAsync();
    }

    if (httpResponseMessage.Content != null)
    {
        error.ResponseContent = await httpResponseMessage.Content.ReadAsStringAsync();
    }

    throw new HttpRequestException(JsonConvert.SerializeObject(error));
}

因此,在失败的情况下,请求消息内容被处理掉,我不知道为什么。
使用:

  • . NET框架4.7.2
  • http运行时4.5
  • System.Net.Http.httpClient
    • 例外:**ObjectDisposedException, Object name: System.Net.Http.StringContent
    • 更新日期:**

未释放响应内容。仅释放请求消息内容。

    • 更新2:**

我们不会因为. NET核心API的问题而面临这个问题,只是因为. NET框架服务的问题

xuo3flqw

xuo3flqw1#

您应该将HttpContent视为流。
因此,一旦读取了它,您需要将它搜索回第0个位置,以便能够重新读取它。

//Before sending it 
await request.Content.LoadIntoBufferAsync();

//Sending out the request

//After receiving the response
var stream = await request.Content.ReadAsStreamAsync();
stream.Seek(0, SeekOrigin.Begin); //OR stream.Position = 0;

var requestBody = await request.Content.ReadAsStringAsync();

相关问题