gpt4 book ai didi

c# - HttpContent.ReadAsStringAsync 导致请求挂起(或其他奇怪的行为)

转载 作者:太空狗 更新时间:2023-10-29 17:46:34 29 4
gpt4 key购买 nike

我们正在构建一个高度并发的 Web 应用程序,最近我们开始广泛使用异步编程(使用 TPL 和 async/await)。

我们有一个分布式环境,其中应用程序通过 REST API(构建在 ASP.NET Web API 之上)相互通信。在一个特定的应用程序中,我们有一个 DelegatingHandler,它在调用 base.SendAsync 之后(即在计算响应之后)将响应记录到一个文件中。我们在日志中包含响应的基本信息(状态码、 header 和内容):

public static string SerializeResponse(HttpResponseMessage response)
{
var builder = new StringBuilder();
var content = ReadContentAsString(response.Content);

builder.AppendFormat("HTTP/{0} {1:d} {1}", response.Version.ToString(2), response.StatusCode);
builder.AppendLine();
builder.Append(response.Headers);

if (!string.IsNullOrWhiteSpace(content))
{
builder.Append(response.Content.Headers);

builder.AppendLine();
builder.AppendLine(Beautified(content));
}

return builder.ToString();
}

private static string ReadContentAsString(HttpContent content)
{
return content == null ? null : content.ReadAsStringAsync().Result;
}

问题是这样的:当代码到达 content.ReadAsStringAsync().Result 时,在服务器负载很重的情况下,请求有时会卡在 IIS 上。当它返回时,它有时会返回一个响应——但在 IIS 上挂起,就好像它没有返回一样——或者在其他时候它永远不会返回。

我也曾尝试使用 ReadAsByteArrayAsync 读取内容,然后将其转换为 String,但没有成功。

当我将代码转换为在整个过程中使用异步时,我得到了更奇怪的结果:

public static async Task<string> SerializeResponseAsync(HttpResponseMessage response)
{
var builder = new StringBuilder();
var content = await ReadContentAsStringAsync(response.Content);

builder.AppendFormat("HTTP/{0} {1:d} {1}", response.Version.ToString(2), response.StatusCode);
builder.AppendLine();
builder.Append(response.Headers);

if (!string.IsNullOrWhiteSpace(content))
{
builder.Append(response.Content.Headers);

builder.AppendLine();
builder.AppendLine(Beautified(content));
}

return builder.ToString();
}

private static Task<string> ReadContentAsStringAsync(HttpContent content)
{
return content == null ? Task.FromResult<string>(null) : content.ReadAsStringAsync();
}

现在 HttpContext.Current 在调用 content.ReadAsStringAsync() 后为 null,并且它在所有后续请求中保持为 null !我知道这听起来难以置信 - 我花了一些时间和三位同事在场才接受这真的发生了。

这是某种预期行为吗?我在这里做错了什么吗?

最佳答案

我遇到了这个问题。尽管我还没有完全测试过,但使用 CopyToAsync 而不是 ReadAsStringAsync 似乎可以解决问题:

var ms = new MemoryStream();
await response.Content.CopyToAsync(ms);
ms.Seek(0, SeekOrigin.Begin);

var sr = new StreamReader(ms);
responseContent = sr.ReadToEnd();

关于c# - HttpContent.ReadAsStringAsync 导致请求挂起(或其他奇怪的行为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797236/

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