Die*_*ego 5 sql ssis webclient sql-server-2005 ssis-2005
我有一个非常奇怪的情况.
我有这个非常简单的包:

"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)
Run Code Online (Sandbox Code Playgroud)被调用的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 个,以避免主机过载。.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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
912 次 |
| 最近记录: |