gpt4 book ai didi

sql - SSIS 包上的 uri 和 WebClient 类的奇怪行为

转载 作者:行者123 更新时间:2023-12-03 03:37:33 25 4
gpt4 key购买 nike

我的情况很奇怪。

我有这个非常简单的包:

enter image description here

  • 任务“获取列表”从程序集中检索数据表列和要运行到对象变量中的 URL 列表。
  • “foreach”循环遍历对象变量并加载URL 到 url 字符串变量
  • “运行”,使用此代码调用 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 个。循环循环 4 次,脚本被调用 4 次(我可以看看是否调试它),myWebClient.OpenReadAsync(myURI) 行使用 4 个不同的值执行 4 次,但只有 2 次调用到 URL 已完成。

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

所以我剩下了 VB 代码,这是我第一次使用 uri 和 WebClient,所以我想知道我是否做错了什么。我还尝试在通话之间添加 5 秒的 sleep 时间,但没有成功。

如有任何帮助,我们将不胜感激。谢谢

最佳答案

所有浏览器都应将每个主机的请求限制为 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;

关于sql - SSIS 包上的 uri 和 WebClient 类的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10723092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com