我正在通过HttpWebRequest
从远程服务读取数据。收到的 JSON 消息临时存储为List(Of Customer)
,随后使用 Dapper 插入到 Azure SQL 中的表中。应用程序作为 ASP.NET 运行,在 Azure 应用服务中托管了 .Net Framework 4.6.2。所以这是两个步骤:
A. 通过 HTTP 请求获取数据并存储为List(Of Customer)
B. 使用 Dapper 将List(Of Customer)
插入到 Azure SQL 中的"客户"表中。
这工作正常,直到我尝试在同一过程中读取和插入另一组数据:
C. 通过 HTTP 请求获取数据并存储为List(Of Payment)
D. 使用 Dapper 将List(Of Payment)
插入到 Azure SQL 中的付款表中。
问题:第二个 HTTP 请求(步骤 C)总是超时。我已经做了多次测试。以下是我的观察:
- 这两个 HTTP 请求在独立执行时通常需要 2 到 3 秒才能完成。
- 将步骤顺序更改为 A、C、B、D 效果很好。多个后续请求 A、C、A、C、...工作也是如此。这证明没有远程服务器问题。
- HTTP 请求超时仅在 SQL 插入之前出现。
- 我将 A+B 分成一个函数,将 C+D 分成另一个函数,并通过 GUI 通过两个单独的按钮触发它们。超时出现。
- 当 C+D 在 A+B 之后执行但延迟 1 - 2 分钟时,一切正常。似乎在步骤 A+B 中插入的数据越少,正确执行所需的 C+D 延迟就越小。
- 执行 A+B 后,对同一服务器(如 A)的任何其他 HTTP 请求总是超时,即使请求的 URL 不存在也是如此。其他HTTP请求是否通过同一浏览器窗口,其他浏览器窗口甚至从其他PC触发(不同的 asp.net 会话)都没有关系
- 一旦上一点中提到的任何其他HTTP请求被取消(触发它的浏览器窗口将被关闭或重定向到其他页面),而无需等待超时,也不会延迟1-2分钟,C + D将正常工作。甚至在几秒钟后触发。只是只有第一个请求超时。
- 我试图增加
ServicePoint.ConnectionLimit
和System.Net.ServicePointManager.DefaultConnectionLimit
但它们已经设置为Int32.MaxValue
.
这演示了 SQL 插入和后续 HTTP 请求之间的一些链接。然而,这似乎很难相信,我会指出一些更普遍的问题,如内存泄漏等。
编辑:
试图进一步调查它。使用原始方案 A+B+C+D,一旦第一个 HTTP 请求返回的行数受到限制,它就开始工作。最初远程服务返回 18.000 行。似乎 10.000 在开始工作时是数字(某些执行仍然运行错误)。步骤 A 中有 9.000 行代码运行没有任何问题。当然,步骤 B 中的 SQL 插入需要更少的时间。
在步骤A和C中为Web服务请求设置HttpWebRequest.KeepAlive = False
解决了这个问题。
但是仍然不知道为什么它会有所帮助以及潜在问题的原因是什么。