需要注意的一件事是,HTTP 连接管理器上有 timeout 属性,但它用于控制与 Web 服务的实际连接。如果有意义的话,它不控制调用特定方法的实际时间。
我有一个 2005 年的软件包,它使用了一个用于清理地址的 Web 服务。该网络服务在内部托管,因此 HTTP 连接与 LAN 速度一样,没有问题。该服务本身可以很快标准化一个地址。当我需要批量清理几十万时,这需要相当多的时间。从 2008 R2 开始,XML 任务有一个内置的不可更改的默认超时,即 6 分钟。如果您需要它是 3601 秒或永不超时,这不是那么方便。我在查找文档时遇到了麻烦,但您可以通过启动一个休眠 6 分钟以上的服务来验证行为。
我们的解决方案是使用脚本任务来处理实际的服务调用,以便我们可以覆盖Timeout
服务调用的属性。
Public Sub Main()
Dim url As String
Dim inboundFile As String
Dim success As Boolean
Dim timeoutMs As Integer
' 1 hour = 60min * 60 sec * 1000 milliseconds
timeoutMs = 60 * 60 * 1000
inboundFile = CStr(Dts.Variables("NetworkShareInput").Value)
url = CStr(Dts.Variables("WebService").Value)
Try
Dim svc As New AddressCleanerService(url)
' Explicitly provide a timeout for the web service connection
svc.Timeout = timeoutMs
svc.Credentials = System.Net.CredentialCache.DefaultCredentials
success = svc.CleanBulkAddresses(inboundFile)
Catch ex As Exception
Dts.Events.FireError(0, "Address cleaning", "Something failed in the address component stuff", String.Empty, 0)
Dts.Events.FireError(0, "Address cleaning", ex.ToString(), String.Empty, 0)
End Try
If (success) Then
Dts.TaskResult = ScriptResults.Success
Else
Dts.TaskResult = ScriptResults.Failure
End If
End Sub