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)
为什么我的过滤器返回空白页?
您应该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)
| 归档时间: |
|
| 查看次数: |
1747 次 |
| 最近记录: |