0

我有一个具有许多操作方法的控制器。我的要求是检查数据库中字段的值,如果字段值为“true”,则所有操作方法都可以执行,否则这些操作方法不应该执行。该方法在服务层

public class CustomAttributeFilter : ActionFilterAttribute
{
    public  override void  OnActionExecuting(ActionExecutingContext filterContext)
    {
        var myFlag = await _adminDB.GetFlagSettingsAsync();
        
        // how do i call async method from OnActionExecuting filter
        if (!myFlag)
        {
            //Create your result
            filterContext.Result = new EmptyResult();
        }
        else
        {
            base.OnActionExecuting(filterContext);
        }
    }

}

接口实现

public interface IAdminDB
    {
        
        Task<MySettings> GetMySettingsAsync();
    }

public class AdminDB : IAdminDB
    {
public async Task<MySettings> GetMySettingsAsync()
        {
            var dbName = _appSettings.AdminDbName;
            var blobName = _appSettings.AdminBlobName;
            return await _dbStorage.GetBlobAsync<MySettings>(blobName, dbName);
        } 
}



public class MySettings
    {      
        public bool MyFlag { get; set; }
    }

我收到一条错误消息“找不到合适的方法来覆盖”。如何清除此错误以及如何正确注入服务。以上是我尝试过的,对 async 的调用在这里失败了。

4

1 回答 1

0

我在您的代码中看不到 _adminDB 依赖项的来源,但我猜这是导致问题的原因。

如果要使用异步过滤器,则必须实现 IAsyncActionFilter 接口。

您可以从执行上下文的 DI 容器中检索服务,并通过以下方式使用异步方法:

 public class CustomAttributeFilter : ActionFilterAttribute
 {
     public override async Task OnActionExecutionAsync(
    ActionExecutingContext context, ActionExecutionDelegate next)
     {
         var adminDb = filterContext.HttpContext.RequestServices.GetService<AdminDb>();
         var myFlag = await adminDb.GetFlagSettingsAsync();
         
         //..

         await next();
     }
 }

根据您的需要,您也可以将自定义逻辑放在 next() 调用之后。

有关更多信息,请参阅文档

于 2021-12-17T11:57:49.877 回答