我有一個帶有許多操作方法的控制器。我的要求是檢查資料庫中某個欄位的值,如果該欄位值為“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; }
}
我收到一條錯誤訊息“找不到合適的方法來覆寫”。如何清除此錯誤以及如何正確注入服務。以上是我嘗試過的,這里對異步的呼叫失敗了。
uj5u.com熱心網友回復:
我在您的代碼中看不到 _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() 呼叫之后放置自定義邏輯。
有關更多資訊,請參閱檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/387517.html
標籤:网站 asp.net-mvc .net核心 动作过滤器属性 自定义操作过滤器
上一篇:如何使用內連接SQLASP.NET從一張表中一次查詢兩次
下一篇:如何在快速服務器中接收json
