将 AuthorizationFilters 与异步方法调用一起使用时的编译器警告

Compiler warning when using AuthorizationFilters with async method calls

我有一个相当不错的控制器,需要先登录才能进行任何其他调用。我有一个授权过滤器设置来拒绝访问未经身份验证的方法,但我正在尝试为登录方法设置覆盖。

问题是控制器正在使用异步调用,因此会产生一个关于必须等待它的编译器警告。

这里是过滤器注册:

builder.RegisterType<MyAuthorizationFilter>()
    .AsWebApiAuthorizationFilterOverrideFor<MyController>(c => c.LoginAsync(null))
    .InstancePerRequest();

警告是:

Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.

在表达式中插入 await 并转换为异步 lamba 会破坏方法定义,因此这不是此处的选项。

似乎 工作正常,但我想确认这是应该如何完成的,或者我已经出路了。

AsWebApiAuthorizationFilterOverrideFor 需要 MethodInfo。为了获得它,该方法要求一个表达式树并解析它以找到 MethodInfo

C# 编译器不知道表达式树只会用于解析。所以它显示 CS4014 警告 Compiler Warning CS4014 (MSDN)。 为避免此警告,代码需要 await,因此正确的代码应为

 .AsWebApiAuthorizationFilterOverrideFor<MyController>(async c => await c.LoginAsync(null))

但由于await/async的复杂性,不能与with表达式树混合使用。

因为这段代码不会被执行,只是被解析,所以这段代码没有问题。 如果你想隐藏警告,你可以用

包围你的代码
#pragma warning disable 4014 // hide warning because this code won't be executed
builder.RegisterType<MyAuthorizationFilter>()
    .AsWebApiAuthorizationFilterOverrideFor<MyController>(c => c.LoginAsync(null))
    .InstancePerRequest();
#pragma warning restore 4014