【问题标题】:IAsyncActionFilter return blank pageIAsyncActionFilter 返回空白页
【发布时间】:2020-12-27 18:43:36
【问题描述】:

如果应用程序在appsettings.json 中设置了 OnMaintenance,我正在尝试实现 IAsyncActionFilter 以重定向到Maintenance 页面。

我首先实现了 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);
            }
        }
    }
}

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

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

services.AddMvc(options =>
{
    options.Filters.Add(new MaintenanceFilter());
});

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

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

即使我像这样将 ActionFilter 留空:

public class MaintenanceFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        
    }
}

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

【问题讨论】:

    标签: c# asp.net-core action-filter


    【解决方案1】:

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

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-20
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 2013-07-06
      相关资源
      最近更新 更多