如果中间件将用户重定向到不同的页面(Razor Pages),我如何防止原始页面表单被执行和呈现? &



让我们假设以下Razor页面类:

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端点仍然被执行和呈现,因为消息Index.ctor()Index.OnGet()也被打印。

从浏览器端看,一切正常,/Index返回一个302重定向代码,然后浏览器请求/Divert。为什么索引仍然在服务器上执行和呈现,我如何避免这种情况?

我必须调用_next委托,因为否则请求管道将被破坏,并且不会向浏览器发送任何内容。

添加一点上下文,在我的实际项目中,中间件将检查是否存在关键配置文件,如果没有,它将用户重定向到可以创建文件的设置页面。所有其他页面(例如本例中的Index)都依赖于此配置,如果缺少该配置,它们将抛出异常。

是的,我可以为每个单页模型类添加安全检查,但我希望有一个更简单的解决方案,可以防止在重定向后执行原始端点。

找到了答案,只需要在重定向后调用中间件中的context.Response.CompleteAsync()

最新更新