CSharp - 在webapi中,C# 死锁从异步DelegatingHandler读取异步响应内容

  显示原文与译文双语对照的内容
51 5

问题

我在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和控制器/modelbinder ) 读取内容时,我已经读到这一点。 如果一个或者多个异步响应的结果已经读取了结果/响应流,那么另一个实例已经读取了结果/响应流,然后返回 null 。

我的第一个请求是点击一个简单控制器,但是第二个请求命中一个控制器,该属性检查操作参数"id",检查操作参数。 我已经读到了,当DelegatingHandler和控制器ModelBinder都试图读取你死锁的响应时。

备用方法 ( 也失败)

我还尝试使用其他方法( 如其他问题所见),它使用英镑但这似乎仍然锁在。 我明白这个方法不使用英镑,结果方法并直接从响应流( 某种方式) 中读取。


 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);



请帮助!

时间: 原作者:

...