在异步控制器操作中发生错误时重定向用户

ama*_*eur 5 c# asp.net-mvc wcf asynchronous task

我有一个ASP.NET MVC 4 Web应用程序,它通过WCF服务从数据源中检索数据.

我已经设置了大多数控制器Async和后续方法Task.

我遇到了一个问题.如果我的代码中发生异常,则正在加载的页面将继续加载,并在最后超时显示IIS错误页面.

我有一个友好的错误信息设置,并适用于sync行动但不适用async.即使可能在不同级别发生异常,操作也会继续运行.我尝试将该AsyncTimeout属性应用于控制器操作,但没有运气,页面只是长时间加载.

任何想法如何在我的代码中处理这个问题,最好是在全局类型级别,并在async控制器操作出现问题时将用户引导到错误页面?

Dav*_*ich 4

方法#1

在 Web.config 中将 customErrors 设置为 On 或 RemoteOnly

<system.web>
    <customErrors mode="On" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

将 HandleErrorAttribute 与自定义错误视图结合使用

[AsyncTimeout(1000)]
[HandleError(ExceptionType=typeof(System.TimeoutException), View="Timeout")]
public async Task<ActionResult> AsyncActionResultReport()
{
Run Code Online (Sandbox Code Playgroud)

方法#2

重写异步控制器的 OnException 方法,或使用自定义异常属性

public override void OnException(ExceptionContext filterContext)
{
    if(filterContext.Exception is TimeoutException && filterContext.Controller is AsyncController)
    {
        filterContext.HttpContext.Response.StatusCode = 200;
        filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary {
                    { "Controller", "Home" },
                    { "Action", "TimeoutRedirect" }
        filterContext.ExceptionHandled = true;
    }

    base.OnException(filterContext);
}
Run Code Online (Sandbox Code Playgroud)