当 API 响应时间较长(例如 60 秒)时,我想重定向到“ https://www.mydomain/Timeout ”之类的错误页面。从 API 获取响应的逻辑是在同一 VS 解决方案中 ServiceLayer 项目中的异步方法中编写的。该异步方法正在非异步控制器中调用(存在于同一 VS 解决方案的 Web 项目中)。当我检查异步方法中的时间并在此基础上在控制器中执行 Response.Redirect 时,它就可以工作了。但是,我想在异步方法中执行此操作,因为这是由大约 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") }}在该方法中,我仅向您展示了所需的代码,其余逻辑已被删除。
1 回答
喵喵时光机
TA贡献1846条经验 获得超7个赞
我如何根据上述评论遵循该方法:
Dictionary<string, bool> d= new Dictionary<string, bool>();
我在编写 API 调用方法的类中创建了一个静态字典,例如,MyApiClass
我将代码行
client.timeout
= [your time here in milliseconds]; 用于 API 发送请求。当 API 超时时,它会抛出异常
TaskTimeoutException
,因此我捕获了异常并将代码放入 catch 块中,如下所示d.Add("timeout", true);
我创建了自定义操作过滤器并应用了以下代码:
public class CustomActionFilter : ActionFilterAttribute{ public override void OnActionExecuted(ActionExecutedContext filterContext) { if(MyApiClass.d.ContainsKey("timeout") && d["timeout"]) { throw new Exception(); } } }
我把它应用
[CustomActionFilter]
到了动作上。当执行操作并输入自定义过滤器时,它会通过检查字典条目抛出异常。现在,我们
Application_Error()
在Global.asax.cs中捕获了异常。在
Application_Error()
我们编写了重定向到所需页面的代码。
注意:在步骤 4 中,您可以创建自定义异常以提供更精确的日志记录详细信息。
- 1 回答
- 0 关注
- 110 浏览
添加回答
举报
0/150
提交
取消