如果中间件将用户重定向到不同的页面(Razor 页面),如何防止执行和呈现原始页面表单
How can I prevent the original Page form being executed and rendered, if a Middleware redirects the user to a different Page (Razor Pages)
让我们假设以下 Razor 页面 classes:
public class IndexModel : PageModel
{
public IndexModel() => Console.WriteLine("Index.ctor()");
public void OnGet() => Console.WriteLine("Index.OnGet()");
}
public class Divert : PageModel
{
public Divert() => Console.WriteLine("Divert.ctor()");
public void OnGet() => Console.WriteLine("Divert.OnGet()");
}
以及以下中间件:
public class TestMiddleware
{
private readonly RequestDelegate _next;
public TestMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (!context.Request.Path.ToString().Contains("Divert"))
context.Response.Redirect("/Divert");
await _next(context);
}
}
// Startup.cs:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStaticFiles();
app.UseRouting();
app.UseMiddleware<TestMiddleware>();
app.UseEndpoints(endpoints => endpoints.MapRazorPages());
}
如您所见,中间件将每个请求重定向到 /Divert,除非请求转到 /Divert 以避免无限重定向。当我启动服务器并尝试转到 /Index 时,由于重定向,我希望在控制台上只看到 Divert.ctor()
和 Divert.OnGet()
消息,但由于某种原因,原始索引端点仍然是已执行并呈现,因为还打印了消息 Index.ctor()
和 Index.OnGet()
。
从浏览器方面看,一切正常,/Index returns 一个 302 重定向代码,然后浏览器请求 /Divert。 为什么 Index 仍然在服务器上执行和呈现,我该如何避免这种情况?
我必须调用 _next 委托,否则请求管道将被破坏,并且不会向浏览器发送任何内容。
添加一点上下文,在我的实际项目中,中间件将检查是否存在关键配置文件,如果不存在,它将用户重定向到可以创建文件的设置页面.所有其他页面(例如本例中的索引)都依赖于此配置,如果缺少它,它们将抛出异常。
是的,我可以为每个页面模型添加安全检查 class,但我希望有一个更简单的解决方案可以防止在重定向后执行原始端点。
找到答案,只需要在重定向后的中间件中调用context.Response.CompleteAsync()
。
让我们假设以下 Razor 页面 classes:
public class IndexModel : PageModel
{
public IndexModel() => Console.WriteLine("Index.ctor()");
public void OnGet() => Console.WriteLine("Index.OnGet()");
}
public class Divert : PageModel
{
public Divert() => Console.WriteLine("Divert.ctor()");
public void OnGet() => Console.WriteLine("Divert.OnGet()");
}
以及以下中间件:
public class TestMiddleware
{
private readonly RequestDelegate _next;
public TestMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (!context.Request.Path.ToString().Contains("Divert"))
context.Response.Redirect("/Divert");
await _next(context);
}
}
// Startup.cs:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStaticFiles();
app.UseRouting();
app.UseMiddleware<TestMiddleware>();
app.UseEndpoints(endpoints => endpoints.MapRazorPages());
}
如您所见,中间件将每个请求重定向到 /Divert,除非请求转到 /Divert 以避免无限重定向。当我启动服务器并尝试转到 /Index 时,由于重定向,我希望在控制台上只看到 Divert.ctor()
和 Divert.OnGet()
消息,但由于某种原因,原始索引端点仍然是已执行并呈现,因为还打印了消息 Index.ctor()
和 Index.OnGet()
。
从浏览器方面看,一切正常,/Index returns 一个 302 重定向代码,然后浏览器请求 /Divert。 为什么 Index 仍然在服务器上执行和呈现,我该如何避免这种情况?
我必须调用 _next 委托,否则请求管道将被破坏,并且不会向浏览器发送任何内容。
添加一点上下文,在我的实际项目中,中间件将检查是否存在关键配置文件,如果不存在,它将用户重定向到可以创建文件的设置页面.所有其他页面(例如本例中的索引)都依赖于此配置,如果缺少它,它们将抛出异常。
是的,我可以为每个页面模型添加安全检查 class,但我希望有一个更简单的解决方案可以防止在重定向后执行原始端点。
找到答案,只需要在重定向后的中间件中调用context.Response.CompleteAsync()
。