当前位置: 首页 > 编程语言 > C#

死锁从Webapi中的AsynchronousDelegatingHandler读取异步响应内容

时间:2023-04-10 16:31:31 C#

DeadlockReadingAsynchronousDelegatingHandlerinWebapi问题我在WebAPI中使用DelegatingHandler读取响应内容并审计到数据库。当代码到达.ReadAsStringAsync()时,它似乎锁定并阻止其他请求完成。我只知道这一点,因为当我删除有问题的行时,它工作得很好。publicstaticvoidRegister(HttpConfigurationconfig){config.MessageHandlers.Add(newResourceAuditHandler());}publicclassResourceAuditHandler:DelegatingHandler{protectedoverrideasyncTaskSendAsync(HttpRequestMessagerequest,CancellationTokencancellationToken){varresponse=awaitbase.SendAsync(request,cancellationToken);字符串内容="";if(response.Content!=null){//这似乎会造成死锁!content=awaitresponse.Content.ReadAsStringAsync();}AuditResponseToDatabase(内容);返回响应;}}可能的原因我已经读到,当应用程序的两个位尝试从相同的请求/响应(DelegatingHandler和Controller/ModelBinder)中读取时会发生这种情况......或者更具体地说,当一个尝试读取.Result时异步响应,但是另一个实例已经读取了结果/响应流,那么它是空的。我的第一个请求命中了一个简单的控制器,但第二个请求命中了一个控制器,该控制器的属性检查Action参数“id”以检查它是否为空。我读到当DelegatingHandler和控制器ModelBinder都试图从响应中读取时,您可能会遇到死锁。替代方法(同样失败)我还尝试使用另一种方法(如其他SO问题中所建议的那样),它使用.ReadAsByteArrayAsync(),但这似乎仍然锁定。我知道此方法不使用.Result方法,而是直接从响应流中读取(以某种方式)。varresponse=awaitbase.SendAsync(request,cancellationToken);字符串内容=””;if(response.Content!=null){varbytes=awaitresponse.Content.ReadAsByteArrayAsync();responseContent=Encoding.UTF8.GetString(bytes);}AuditResponseToDatabase(内容);请帮忙!彼得,首先,您对造成这种僵局的原因的看法是正确的。尝试一直使用async/await。换句话说,不要阻塞异步代码。您应该做的另一件事是使用.ConfigureAwait(false):varresponse=awaitbase.SendAsync(request,cancellationToken).ConfigureAwait(false);字符串内容="";如果(response.Content!=null){content=awaitresponse.Content.ReadAsStringAsync().ConfigureAwait(false);您可以在此链接找到更多信息如果以上都不是,请提供一个完整的示例,好吗?希望这可以帮助!以上就是C#学习教程:Deadlock从webapi中的异步DelegatingHandler读取异步响应内容共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: