HTTP 接続マネージャーにはタイムアウト プロパティがありますが、これは Web サービスへの実際の接続を制御するためのものです。意味がある場合、特定のメソッドを呼び出す実際の時間を制御しません。
アドレスをクリーニングするために Web サービスを使用する 2005 年のパッケージがありました。Web サービスは内部でホストされているため、HTTP 接続は LAN の速度であり、問題はありませんでした。サービス自体は、1 つのアドレスをかなり迅速に標準化できます。数十万をまとめてクリーンアップする必要がある場合、それにはかなりの時間がかかります。XML タスクには、2008 R2 の時点で、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