gpt4 book ai didi

c# - 死锁从webapi中的异步DelegatingHandler读取异步响应内容

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:33 24 4
gpt4 key购买 nike

问题

我在 WebAPI 中使用 DelegatingHandler 来读取响应内容并将其审核到数据库。

当代码到达 .ReadAsStringAsync() 时,它似乎锁定并阻止其他请求完成。我只知道这一点,因为当我删除有问题的行时,它工作得很好。

public static void Register(HttpConfiguration config)
{
config.MessageHandlers.Add(new ResourceAuditHandler());
}

public class ResourceAuditHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);

string content = "";
if (response.Content != null)
{
//THIS SEEMS TO CREATE DEADLOCK!
content = await response.Content.ReadAsStringAsync();
}

AuditResponseToDatabase(content);

return response;
}
}

可能的原因

我读过当应用程序的两个位试图从相同的请求/响应(一个 DelegatingHandler 和 Controller/ModelBinder)中读取内容时会发生这种情况......或者更具体地说,当一个人试图读取 .Result 的异步响应,但另一个实例已经读取了 Result/Response Stream,然后为 null。

我的第一个请求命中了一个简单的 Controller ,但第二个请求命中了一个 Controller ,该 Controller 具有检查 Action 参数“id”以检查其不为空的属性。我读过,当 DelegatingHandler 和 Controller ModelBinder 都试图从 Response 中读取时,您会遇到死锁。

替代方法(同样失败)

我也尝试过使用其他方法(如其他 SO 问题中所见),它使用 .ReadAsByteArrayAsync() 但这似乎仍然锁定。我了解到此方法不使用 .Result 方法,而是直接从响应流中读取(以某种方式)。

 var response = await base.SendAsync(request, cancellationToken);

string content= "";
if (response.Content != null)
{
var bytes = await response.Content.ReadAsByteArrayAsync();
responseContent = Encoding.UTF8.GetString(bytes);
}

AuditResponseToDatabase(content);

请帮忙!

最佳答案

Peter,首先,您对造成这种僵局的原因的看法是正确的。尝试一直使用 async/await。换句话说,不要阻塞 async 代码。您应该做的另一件事是使用 .ConfigureAwait(false):

    var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);

string content = "";
if (response.Content != null)
{
content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
}

您可以在此 link 找到更多信息

如果以上都不行,请提供一个完整的例子好吗?

希望这对您有所帮助!

关于c# - 死锁从webapi中的异步DelegatingHandler读取异步响应内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24326043/

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