如何从MVC中的异步方法重定向到页面

时间:2019-07-23 11:06:00

标签: c# asp.net-mvc

当API需要更长的响应时间(例如60秒)时,我想重定向到类似“ https://www.mydomain/Timeout”的错误页面。

从API获取响应的逻辑是用同一VS解决方案中ServiceLayer项目中存在的async方法编写的。

该异步方法在非异步控制器中被调用(存在于同一VS解决方案中的Web项目中)。

当我检查异步方法中的时间,并在此基础上执行Response.Redirect,然后在控制器中工作。但是,我想在async方法中执行此操作,因为这是大约50个API所调用的方法。因此,宁愿在每个控制器中执行Response.Redirect,我想从这里开始处理它,以便它适用于每个API。

现在请帮我怎么做?

  1. 我试图将Response.Redirect(“ https://www.mydomain/timeout”)放在异步方法中,但这不起作用。

  2. 我也尝试了Server.Transfer,但是没有运气。这是由于异步方法造成的。

下面是用异步方法编写的从API获取响应的代码。

private async Task<T1> PostA<T1,T2>(string method, T2 request, string api,
            bool isPut)
{
  Stopwatch sw = new Stopwatch();
  sw.Start();

        var response = isPut ? 
               await client.PutAsync(parturl, 
                 body).ConfigureAwait(continueOnCapturedContext: false) :
               await client.PostAsync(parturl, 
                 body).ConfigureAwait(continueOnCapturedContext: false);

  sw.Stop();

  long elapsedTime = sw.ElapsedMilliseconds;

  if (elapsedTime >= 60000)
  {
     Response.Redirect("https://www.mydomain/timeout")
  }
}

在我只向您显示了所需代码的方法中,其余逻辑已被删除。

1 个答案:

答案 0 :(得分:0)

在上述评论的基础上,我如何遵循这种方法:

  1. 我在编写我的API调用方法的类中创建了一个Dictionary<string, bool> d= new Dictionary<string, bool>();静态字典,例如MyApiClass
  2. 我将代码行client.timeout = [您在这里的时间以毫秒为单位];用于API发送请求。
  3. 当API超时时,它将抛出TaskTimeoutException,因此我捕获了异常并将代码作为d.Add("timeout", true);放在catch块中

  4. 我创建了自定义操作过滤器,并应用了以下代码:

    public class CustomActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if(MyApiClass.d.ContainsKey("timeout") && d["timeout"])
            {
                throw new Exception();
            }
        }
    }
    
  5. 我在操作上应用了[CustomActionFilter]

  6. 在执行操作并输入自定义过滤器时,它会通过检查字典条目来引发Exception。现在,我们在 Global.asax.cs 中有Application_Error()可以捕获异常。

  7. Application_Error()中,我们编写了用于重定向到所需页面的代码。

注意:在第4步中,您可以创建自定义异常,以提供更精确的日志详细信息。