當 API 響應時間較長(例如 60 秒)時,我想重定向到“ https://www.mydomain/Timeout ”之類的錯誤頁面。從 API 獲取響應的邏輯是在同一 VS 解決方案中 ServiceLayer 項目中的異步方法中編寫的。該異步方法正在非異步控制器中調用(存在于同一 VS 解決方案的 Web 項目中)。當我檢查異步方法中的時間并在此基礎上在控制器中執行 Response.Redirect 時,它就可以工作了。但是,我想在異步方法中執行此操作,因為這是由大約 50 個 API 調用的方法。因此,我不想在每個控制器中執行 Response.Redirect,而是想從這里處理它,以便它適用于每個 API?,F在請幫我看看該怎么做?我嘗試將 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]
到了動作上。當執行操作并輸入自定義過濾器時,它會通過檢查字典條目拋出異?!,F在,我們
Application_Error()
在Global.asax.cs中捕獲了異常。在
Application_Error()
我們編寫了重定向到所需頁面的代碼。
注意:在步驟 4 中,您可以創建自定義異常以提供更精確的日志記錄詳細信息。
- 1 回答
- 0 關注
- 146 瀏覽
添加回答
舉報
0/150
提交
取消