IAsyncActionFilter 返回空白页

M. *_*Ozn 4 c# action-filter asp.net-core

我正在尝试实现 IAsyncActionFilter 以便在Maintenance应用程序在appsettings.json.

我首先实现了 ActionFilter 如下:

public class MaintenanceFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        string controller = (string)context.RouteData.Values["Controller"];
        string action = (string)context.RouteData.Values["action"];

        if (controller != "States" && action != "Maintenance")
        {
            var cs = context.HttpContext.RequestServices.GetService<IClientService>();

            if (await cs.GetMaintenanceState())
            {
                context.Result = new RedirectToActionResult("Maintenance", "States", null);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,它只是从请求的 RouteData 中读取控制器和操作。如果操作不是“维护”,我会询问 API 应用程序是否处于维护状态。如果是,则返回到“维护”操作。

然后,在 中Startup.cs,我将 actionfilter 设为全局:

services.AddMvc(options =>
{
    options.Filters.Add(new MaintenanceFilter());
});
Run Code Online (Sandbox Code Playgroud)

actionfilter 按预期工作,如果 api 返回 true,它会重定向到维护操作,否则它会重定向到最初请求的页面。

但无论应用程序是否处于维护状态,返回的 html 代码始终为空白。

即使我像这样将 ActionFilter 留空:

public class MaintenanceFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我的过滤器返回空白页?

Mo *_* B. 6

您应该await next()在 的末尾调用OnActionExecutionAsync,否则实际操作不会执行:

public class MaintenanceFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        string controller = (string)context.RouteData.Values["Controller"];
        string action = (string)context.RouteData.Values["action"];

        if (controller != "States" && action != "Maintenance")
        {
            var cs = context.HttpContext.RequestServices.GetService<IClientService>();

            if (await cs.GetMaintenanceState())
            {
                context.Result = new RedirectToActionResult("Maintenance", "States", null);
            }
        }
    }
    await next(); // this executes the actual action
}
Run Code Online (Sandbox Code Playgroud)