当API需要更长的响应时间(例如60秒)时,我想重定向到类似“ https://www.mydomain/Timeout”的错误页面。
从API获取响应的逻辑是用同一VS解决方案中ServiceLayer项目中存在的async方法编写的。
该异步方法在非异步控制器中被调用(存在于同一VS解决方案中的Web项目中)。
当我检查异步方法中的时间,并在此基础上执行Response.Redirect,然后在控制器中工作。但是,我想在async方法中执行此操作,因为这是大约50个API所调用的方法。因此,宁愿在每个控制器中执行Response.Redirect,我想从这里开始处理它,以便它适用于每个API。
现在请帮我怎么做?
我试图将Response.Redirect(“ https://www.mydomain/timeout”)放在异步方法中,但这不起作用。
我也尝试了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")
}
}
在我只向您显示了所需代码的方法中,其余逻辑已被删除。
答案 0 :(得分:0)
在上述评论的基础上,我如何遵循这种方法:
Dictionary<string, bool> d= new Dictionary<string, bool>();
静态字典,例如MyApiClass
client.timeout
= [您在这里的时间以毫秒为单位];用于API发送请求。当API超时时,它将抛出TaskTimeoutException
,因此我捕获了异常并将代码作为d.Add("timeout", true);
放在catch块中
我创建了自定义操作过滤器,并应用了以下代码:
public class CustomActionFilter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if(MyApiClass.d.ContainsKey("timeout") && d["timeout"])
{
throw new Exception();
}
}
}
我在操作上应用了[CustomActionFilter]
。
在执行操作并输入自定义过滤器时,它会通过检查字典条目来引发Exception。现在,我们在 Global.asax.cs 中有Application_Error()
可以捕获异常。
在Application_Error()
中,我们编写了用于重定向到所需页面的代码。
注意:在第4步中,您可以创建自定义异常,以提供更精确的日志详细信息。