ASP.NET CORE 3.1中如何重定向过滤器

4
我有一个扩展了IAsyncActionFilter的属性类,它在ASP.NET CORE 3.1 (C#)中使用。在OnActionExecutionAsync方法内部,我想要重定向到另一个控制器/方法,而不调用任何其他过滤器,这些过滤器位于初始方法调用上。
我尝试在OnActionExecutionAsync方法内部使用以下代码:
context.Result = new RedirectToActionResult("MethodName", "Home", null);
await next();

我这样做时会出现以下错误:

如果 IAsyncActionFilter 通过将 ActionExecutingContext 的 Result 属性设置为非空值来提供结果值,则不能通过调用 ActionExecutionDelegate 调用下一个过滤器。

我可以删除 await next(),但这会导致调用初始方法上的其他过滤器。
我已经在 Google 上进行了广泛搜索,但没有找到答案。
请问如何正确使用语法以实现此目标?
谢谢!

我可以移除 await next(),但是这样会导致调用初始方法的其他过滤器也被调用。我无法重现这个问题。你能否分享一个演示,以便我们可以审查和调试代码?你尝试过 IActionFilter 接口了吗? - Xueli Chen
@XueliChen,我该如何附加演示文稿?我正在使用IAsyncActionFilter。常规版本无法满足我的需求。 - Dan Gifford
您可以在问题中添加能够重现问题的相关代码,或者分享一个演示链接,该链接可以是您在OneDrive或GitHub上发布的URL。请参考https://meta.stackexchange.com/questions/61071/adding-links-to-comments。 - Xueli Chen
@DanGifford:你确定剩余的过滤器被调用了吗?我的理解是,一旦设置了ActionExeutingContext.Result,则其余的过滤器管道将停止执行。请参阅ASP.NET Core中的过滤器文档中的取消和短路部分。 - Jeremy Caney
1个回答

3

我面临着同样的问题,由于没有人回答,所以我分享了自己的解决方案。

如果您设置了结果,请不要调用next():

context.Result = new RedirectToActionResult("MethodName", "Home", null);
if (context.Result != null)
    await next();

这句话应该是 if (context.Result == null) 吧? - John M
我想我的意思是:如果你“有”结果,就不要调用next()。谢谢提醒。 - Rodas PT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接