c# - 转发请求时 ClientConnectionFailure

标签 c# angularjs azure http azure-api-management

我有一个 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 时那样超时。

这让我想到了三种不同的可能性:

  1. C# WebApi 超时并在 APIM 完全响应之前取消请求
  2. Web 应用程序本身超时。
  3. 互联网浏览器 (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 中有几个超时属性,例如 allScriptsTimeoutdefaultTimeoutInterval

增加这些没有效果。

** 最后一种可能性是 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/

相关文章:

javascript - 如何使用 angularjs 和 ionic 更新这个 JSON 数组值

javascript - AngularJS 的 Select2 中的两种方式数据绑定(bind)在 Angular 1.2.13 中不起作用

c# - 本地计算机上的 Azure 移动服务 Nodejs 推送时出错

c# - Windows 服务仅运行列出的第一个服务

c# - 使用 EqualityComparer 初始化静态字典

javascript - AngularJS 中的 Promise

git - 有没有办法使用 AZ CLI 扩展查询与 GIT 存储库关联的所有分支?

c# - 自定义 DataTypeAttribute 未正确触发验证

c# - foreach(... in ...) 或 .ForEach();就是那个问题

azure - 如何在 HTTP 触发器 (POST) 上将 pdf 文件添加到 blob 容器,并在请求正文中包含 pdf