我有一个 Angular Web 应用程序,它由 C# Web Api 支持,这有助于与 Azure Function App 进行交互。
粗略的示例流程如下:
- Angular Web 应用程序(使用选定的参数按下载)-> 向 API 管理服务发送 GET 请求
- API 管理服务调用 C# Web Api
- C# Web Api 然后响应 APIM,后者又调用 Azure Function App 进行进一步处理 来自外部来源的数据
- 一旦 csv 准备就绪,数据负载就会下载到打开 Web 应用程序的浏览器中
对于较大的负载,下载请求会失败,并在 Application Insights 中出现以下错误:
"ClientConnectionFailure at forward-request"
此错误每次都会恰好在 2 分钟内发生,除非有效负载足够小。
这让我相信函数应用程序(在这种情况下我理解为客户端)正在超时并取消请求。
但是使用 Postman 通过 Azure Function App 的本地实例测试具有完全相同参数的 GET,有效负载已成功检索。
所以问题不在于 Azure Function App,因为它在 Postman 中没有像使用 WebApp 时那样超时。
这让我想到了三种不同的可能性:
- C# WebApi 超时并在 APIM 完全响应之前取消请求
- Web 应用程序本身超时。
- 互联网浏览器 (Chrome) 超时。 (Chrome 有 5 分钟的硬性不可更改超时,所以不太可能)
#1。为了解决第一个选项,我升级了在相关下载操作中创建的 HttpClient 的超时:
public aync Task<HttpResponseMessage> DownloadIt(blah)
{
HttpClient client = getHttpClient();
client.Timeout = TimeSpan.FromMilliseconds(Convert.ToDouble(600000)); // 10 minutes
var request = new HttpRequestMessage(HttpMethod.Get, buildQueryString(blah, client.BaseAddress));
return await client.SendAsync(request);
}
private HttpClient getHttpClient()
{
return _httpClientFactory.CreateClient("blah");
}
这没有任何影响,因为观察到了相同的错误。
#2。 protractor.conf.js 中有几个超时属性,例如 allScriptsTimeout
和 defaultTimeoutInterval
。
增加这些没有效果。
** 最后一种可能性是 APIM 本身超时,但是查看相关 API 的 APIM 策略,没有转发请求属性,并且超时,这意味着默认情况下根据 Microsoft 的说法,有APIM 没有超时。 https://learn.microsoft.com/en-us/azure/api-management/api-management-advanced-policies
我尝试了几种不同的策略,但没有成功。
最佳答案
确实存在超时,因为 ClientConnectionFailure 表示客户端关闭了与 API 管理 (APIM) 的连接,而 APIM 尚未向其(客户端)返回响应,在这种情况下,它正在将请求转发到后端(forward-request)
要调试此类问题,最好的方法是收集 APIM inspector trace检查 APIM 管道内的请求处理,注意请求的每个部分(入站、后端、出站)所花费的时间。花费最多时间的部分可能是罪魁祸首(或其依赖项)。希望这可以帮助您找到问题。
关于c# - 转发请求时 ClientConnectionFailure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64705819/