使用SSIS包上的uri和WebClient类的奇怪行为

时间:2012-05-23 15:25:22

标签: sql sql-server-2005 ssis webclient ssis-2005

我有一个非常奇怪的情况。

我有这个非常简单的包:

enter image description here

  • 任务“获取列表”从一个程序集中检索数据表 列和要运行到对象变量的URL列表。
  • “foreach”循环遍历对象变量并加载 URL为url字符串变量
  • “run”,使用此代码调用url(2005年,因此我坚持使用 VB):

    Dim myURI As New Uri("http://" + Dts.Variables("URL").Value.ToString())
    Dim myWebClient As New System.Net.WebClient
    myWebClient.OpenReadAsync(myURI)
    

被调用的URL是内部的,只是读取参数并执行一系列操作需要一些时间,这就是我使用“OpenReadAsync”的原因

我的问题是:如果我有4个要运行的URL,则该程序包只运行其中的2个。循环lops 4次,脚本调用4次(我可以看看是否调试它),行myWebClient.OpenReadAsync(myURI)执行4次,有4个不同的值,但只有2次调用URL。

如果我再次运行该包,则现在调用其他2个URL,这证明URL没有任何问题,如果我在浏览器上手动调用4个URL(例如,在4个选项卡上),一个接下来,它们都会产生预期的结果,这证明了解析URL的代码没有任何问题。

所以我留下了VB代码,这是我第一次使用uri和WebClient,所以我想知道我做错了什么。我也尝试在通话之间增加5秒的睡眠时间,但没有运气。

任何帮助将不胜感激。 感谢

2 个答案:

答案 0 :(得分:4)

预计所有浏览器都会将自己限制为每个主机2个请求,以避免主机过载。 .NET遵循此规则,仅允许与主机的2个并发连接。您可以通过修改应用程序的配置文件或通过代码来更改此限制。

您添加到脚本的延迟不起作用,因为您没有在WebClient实例上调用Dispose。 WebClient类保持其连接处于打开状态,直到您将其处置为读取响应流为止。否则,在垃圾收集器收集客户端之前,您将无法再次连接到同一主机。

此外,OpenReadAsync打开客户端的流并确保它保持打开状态,除非您关闭它或收集它。您应该使用其中一个DownloadXXXAsync来避免无理由打开流。

更好的解决方案是调用DownloadStringAsync并在DownloadStringAsyncCompleted事件中处理客户端。

<强>更新

ServicePointManager.DefaultConnectionLimit存储在静态字段中,这意味着其范围是整个AppDomain。 SSIS为每个包执行使用单个AppDomain,因此该值将影响整个包。

如果要仅使用FindServicePoint修改单个主机的连接限制,可以为主机地址创建ServicePoint,并为此地址设置限制:

var myTarget= ServicePointManager.FindServicePoint(new Uri("http://www.google.com"));
myTarget.ConnectionLimit = 10;

答案 1 :(得分:1)

  1. 尝试延长每个任务和子任务的超时时间。

  2. 我没有被问到,但我会硬编码这样的任务,而不是使用SSIS。 SSIS非常适合ETL,但不是很多!

相关问题