在我的一个EF实体中,我有一个布尔字段,指示是否存在维护 .
因此,仅当此布尔值设置为true时,我才想将所有页面重新路由到503错误页面 .
我可以在每个页面中放入以下代码:
if (_context.SystemParameters.First().Maintenance) return Redirect("/Error/503");
但这根本不是直截了当的 . 有没有最好的方法在我的所有页面上实现这样的条件重定向?
我建议使用PageFilter . 如果您想在所有页面上使用它,可以实现IPageFilter或IAsyncPageFilter并在全局注册 . 如果您需要更多详细信息,我认为您可以查看https://www.learnrazorpages.com/razor-pages/filters
这可以通过一个简单的自定义Middleware组件来实现,该组件允许在进入MVC管道之前执行所需的逻辑 . 这是一个示例实现:
app.Use(async (ctx, next) => { var context = ctx.RequestServices.GetRequiredService<YourContext>(); if (ctx.Request.Path != "/Error/503" && context.SystemParameters.First().Maintenance) { ctx.Response.Redirect("/Error/503"); return; } await next(); });
这里, ctx 是 HttpContext 的一个实例,它首先用于从DI容器中检索 YourContext 的实例,然后用于执行重定向 . 如果 Maintenance 是 false ,则调用 next 以将执行传递给下一个中间件组件 .
ctx
HttpContext
YourContext
Maintenance
false
next
这种对 Use 的调用将在 Startup.Configure 方法中 UseMvc 之前进行,以便允许中间件管道短路 . 请注意,这种方法适用于控制器/视图以及Razor页面 - 如果在维护模式下还有其他中间件需要避免,它也可以放在 Configure 方法中 .
Use
Startup.Configure
UseMvc
Configure
2 回答
我建议使用PageFilter . 如果您想在所有页面上使用它,可以实现IPageFilter或IAsyncPageFilter并在全局注册 . 如果您需要更多详细信息,我认为您可以查看https://www.learnrazorpages.com/razor-pages/filters
这可以通过一个简单的自定义Middleware组件来实现,该组件允许在进入MVC管道之前执行所需的逻辑 . 这是一个示例实现:
这里,
ctx
是HttpContext
的一个实例,它首先用于从DI容器中检索YourContext
的实例,然后用于执行重定向 . 如果Maintenance
是false
,则调用next
以将执行传递给下一个中间件组件 .这种对
Use
的调用将在Startup.Configure
方法中UseMvc
之前进行,以便允许中间件管道短路 . 请注意,这种方法适用于控制器/视图以及Razor页面 - 如果在维护模式下还有其他中间件需要避免,它也可以放在Configure
方法中 .