处理全局异常后页面重定向

Page redirect after handling global exception

我正在学习 Abp 框架,在我的项目中我使用的是第三方 REST 服务,该服务需要身份验证并且会话可能会过期。我找到了处理异常的文档:

https://docs.abp.io/en/abp/latest/Exception-Handling

并实现了一个订阅者,我在其中发现了我在检测到会话已过期时抛出的自定义异常。我在我的网站上使用与第三方帐户相同的 username/password,因此如果 REST 会话过期,我需要将用户发送回登录页面。我试图在 .Application 项目中做这样疯狂的事情

internal class GlobalRedirector : ControllerBase {
    internal IActionResult RedirectToLogin() {
        return RedirectToPage("/Account/Login");
    }
    public class GlobalExceptionSubscriber : ExceptionSubscriber {
        public override async Task<IActionResult> HandleAsync(ExceptionNotificationContext context) {
            if (context.Exception is RestSessionExpiredException) {
                var redirector = new GlobalRedirector();
                return redirector.RedirectToLogin();
            }
            return new OkResult();
        }
    }
}

我调试了一些断点,发现 RedirectToLogin 方法正在执行但不起作用,这就像 Abp 框架正在吞下异常并按照它想要的方式处理它。我从普通页面 OnGet 测试了重定向,它确实有效……在处理全局异常时,无论如何都可以使重定向正常工作吗?

您的代码只创建了一个 RedirectOjbectResult,没有做任何其他事情。

您必须注入 IHttpContextAccessor 并添加重定向到 HttpContext 的响应。

public class MyExSubscriber : ExceptionSubscriber
{
    readonly IHttpContextAccessor _httpContextAccessor;

    public MyExSubscriber(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public override async Task HandleAsync(ExceptionNotificationContext context)
    {
        // do your stuff.

        _httpContextAccessor.HttpContext.Response.Redirect("/account/login");
    }
}