SonarLint是否应该在ASP.NET Web API控制器中触发S3216?看来这个规则适用于桌面应用程序,在ASP.NET中,上下文完全不同,没有死锁的危险。或者我错过了什么?
答案 0 :(得分:4)
当您不需要捕获上下文时,您仍应在WebAPI中使用ConfigureAwait(false)
。
ConfigureAwait
控制是否在捕获的SynchronizationContext
上恢复。确实,这在UI应用程序中是一个更痛苦的问题,但它在所有UI应用程序和所有asp.net应用程序的SynchronizationContext
处都是相关的。
在UI应用程序中,资源SynchronizationContext
管理的是单个UI线程,因此如果阻止它,您可能会死锁。在asp.net应用程序中,资源是请求上下文,您也可以在其上死锁。
您可以避免在控制台应用程序或Windows服务中使用ConfigureAwait
,但在适当的地方继续使用它仍然是一种很好的做法。
答案 1 :(得分:0)
@VictorGrigoriu,我们只检查编译单元的输出类型是否为DLL,并且我们仅在DLL中报告问题。你是对的,我们报告在DLL中你仍然需要切换回原始上下文的情况。一般来说,这是一件非常难以理解的事情,但我们可以添加一个顶级Web应用程序集的检查。我们需要提出一个很好的方法来做到这一点,或者默认情况下禁用规则不会产生误报。
我已创建了一张跟踪此问题的故障单:https://jira.sonarsource.com/browse/SLVS-790。
在我们提出永久解决方案之前的其他选项:如果您觉得这是一个烦恼,您可以在给定项目的本地禁用此规则。为此,您需要通过"参考/分析器/打开活动规则集"
来编辑项目的规则集文件。