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

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

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

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

当我检查异步方法中的时间并在此基础上在控制器中执行 Response.Redirect 时,它就可以工作了。但是,我想在异步方法中执行此操作,因为这是由大约 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")

  }

}

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


jeck猫
浏览 114回答 1
1回答

喵喵时光机

我如何根据上述评论遵循该方法:Dictionary<string, bool> d= new Dictionary<string, bool>();我在编写 API 调用方法的类中创建了一个静态字典,例如,MyApiClass我将代码行client.timeout= [your time here in milliseconds];&nbsp;用于 API 发送请求。当 API 超时时,它会抛出异常TaskTimeoutException,因此我捕获了异常并将代码放入 catch 块中,如下所示d.Add("timeout", true);我创建了自定义操作过滤器并应用了以下代码:public&nbsp;class&nbsp;CustomActionFilter&nbsp;:&nbsp;ActionFilterAttribute{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;override&nbsp;void&nbsp;OnActionExecuted(ActionExecutedContext&nbsp;filterContext) &nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(MyApiClass.d.ContainsKey("timeout")&nbsp;&&&nbsp;d["timeout"]) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;Exception(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} }我把它应用[CustomActionFilter]到了动作上。当执行操作并输入自定义过滤器时,它会通过检查字典条目抛出异常。现在,我们Application_Error()在Global.asax.cs中捕获了异常。在Application_Error()我们编写了重定向到所需页面的代码。注意:在步骤 4 中,您可以创建自定义异常以提供更精确的日志记录详细信息。
打开App,查看更多内容
随时随地看视频慕课网APP