2017-06-16 35 views
0

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

A.采用小巧玲珑的获取通过HTTP请求和存储数据为List(Of Customer)

B.插入List(Of Customer)到客户表中的SQL Azure中。

下获得通过HTTP请求和存储数据的List(Of Payment)

D.插入List(Of Payment)到Azure的付款表:

,直到我尝试阅读并插入另一组在相同的过程数据也能正常工作SQL使用Dapper。

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

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

这表明SQL插入和随后的HTTP请求之间的一些链路。然而,这似乎很难相信,我会在像内存泄漏一些更普遍的问题,等等。

编辑点:

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

+0

它似乎是控制数据最大大小的Web服务的安全权限。联系可以在web.config中修改这些参数的web管理员。 –

+0

不能同意,因为一旦跳过数据库插入,可以从远程服务器读取数据,没有任何问题。看我的观察没有。 2. – Megrez7

回答

0

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

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

+0

但你有一个领导。这是一个错误吗?你错过了微妙的细微差别吗? –

+0

@clifton_h绝对是的。试图找出更多的时刻。任何建议如何调试它? – Megrez7