在SQL插入(Dapper)之后执行HttpWebRequest超时

时间:2017-06-16 20:34:21

标签: asp.net sql-server timeout httpwebrequest dapper

我正在通过HttpWebRequest从远程服务中读取数据。收到的JSON消息暂时存储为List(Of Customer),然后使用Dapper插入Azure SQL中的表中。应用程序作为ASP.NET运行,并在Azure App Service中托管.Net Framework 4.6.2。所以这是两个步骤:

一个。通过HTTP请求获取数据并存储为List(Of Customer)

B中。使用Dapper将List(Of Customer)插入Azure SQL中的Customer表。

这一点正常,直到我尝试在同一过程中读取并插入另一组数据:

℃。通过HTTP请求获取数据并存储为List(Of Payment)

d。使用Dapper将List(Of Payment)插入Azure SQL中的Payment表。

问题:第二个HTTP请求(步骤C)总是超时。我做了多次测试。以下是我的观察:

  1. 独立执行时,两个HTTP请求通常需要2到3秒才能完成。
  2. 将步骤顺序更改为A,C,B,D非常有效。多个后续请求A,C,A,C ......也可以工作。这证明没有远程服务器问题。
  3. 只有在SQL Insert之前出现HTTP请求超时时才会出现。
  4. 我将A + B分成一个函数,将C + D分成另一个函数,并通过GUI通过两个单独的按钮触发它们。超时出现。
  5. 当在A + B之后执行C + D但延迟1-2分钟时,一切都很好。似乎在步骤A + B中插入的数据越少,C + D的延迟就越小,才能正确执行。
  6. 执行A + B后,对同一服务器(作为A)的任何其他HTTP请求总是超时,即使请求的URL不存在也是如此。如果其他HTTP请求是通过相同的浏览器窗口,其他一个甚至是其他PC​​(不同的asp.net会话)触发的,则无关紧要
  7. 一旦上一点提到的任何其他HTTP请求被取消(已触发它的浏览器窗口将被关闭或重定向到其他页面)而不等待超时且不延迟1-2分钟,C + D将正常工作。甚至在几秒钟后触发。只是第一次请求超时。
  8. 我尝试增加ServicePoint.ConnectionLimitSystem.Net.ServicePointManager.DefaultConnectionLimit,但已将其设置为Int32.MaxValue
  9. 这演示了SQL插入和后续HTTP请求之间的一些链接。然而,这似乎很难相信,我会指出一些更普遍的问题,如内存泄漏等。

    编辑:

    尝试进一步调查。使用原始方案A + B + C + D,一旦第一个HTTP请求返回的行数有限,它就开始工作了。最初远程服务返回18.000行。似乎10.000是开始工作时的数字(某些执行仍然运行时出错)。在步骤A中有9.000行代码运行没有任何问题。自然地,步骤B中的SQL插入需要更少的时间。

1 个答案:

答案 0 :(得分:0)

在步骤A和C中为Web服务请求设置HttpWebRequest.KeepAlive = False解决了问题。

然而,仍然不知道为什么它会有所帮助,以及潜在问题的原因是什么。