5

私はかなり奇妙な状況にあります。

私はこの非常にシンプルなパッケージを持っています:

ここに画像の説明を入力してください

  • タスク「getlist」は、1つの列とオブジェクト変数に実行されるURLのリストを持つアセンブリからデータテーブルを取得します。
  • 「foreach」ループはオブジェクト変数をループし、URLをURL文字列変数にロードします
  • 「実行」は、このコードでURLを呼び出します(2005年なのでImはVBで立ち往生しています):

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

呼び出されるURLは内部であり、パラメーターを読み取り、時間がかかる一連の操作を実行するだけなので、「OpenReadAsync」を使用しました。

私の問題は、実行するURLが4つある場合、パッケージはそのうちの2つだけを実行することです。ループは4回ループし、スクリプトは4回呼び出され(デバッグするかどうかを確認できます)、行myWebClient.OpenReadAsync(myURI)は4つの異なる値で4回実行されますが、URLへの呼び出しは2回だけです。

パッケージを再度実行すると、他の2つのURLが呼び出されます。これは、URLに問題がないことを証明し、ブラウザーで4つのURLを手動で(たとえば、4つのタブで)次々に呼び出すと、それらはすべて期待される結果を生成します。これは、URLを解析するコードに問題がないことを証明します。

だから私はVBコードを残しました。ImがuriとWebClientを初めて使用したので、Imが何か間違ったことをしているのではないかと思います。また、通話の間に5秒間のスリープを追加しようとしましたが、うまくいきませんでした。

どんな助けでもいただければ幸いです。ありがとう

4

2 に答える 2

4

すべてのブラウザは、ホストの過負荷を回避するために、ホストごとに2つのリクエストに制限することが期待されています。.NETはこのルールに従い、ホストへの同時接続は2つだけ許可します。この制限は、アプリケーションの構成ファイルを変更するか、コードを使用して変更できます。

  • 構成ファイルの制限を変更するには、system.net /connectionManagement要素のmaxConnection属性を変更します。
  • コードを使用して制限を変更するには、静的なServicePointManager.DefaultConnectionLimitプロパティを変更します。

WebClientインスタンスでDisposeを呼び出さなかったため、スクリプトに追加した遅延は機能しませんでした。WebClientクラスは、応答ストリームを読み取るために破棄するまで、接続を開いたままにします。そうしないと、ガベージコレクターがクライアントを収集するまで、同じホストに再度接続できなくなります。

さらに、OpenReadAsyncはストリームをクライアントに開き、閉じるか収集されない限り、ストリームが開いたままになるようにします。理由なしにストリームを開かないようにするには、DownloadXXXAsyncのいずれかを使用する必要があります。

より良い解決策は、DownloadStringAsyncを呼び出し、DownloadStringAsyncCompletedイベントでクライアントを破棄することです。

アップデート:

ServicePointManager.DefaultConnectionLimitは静的フィールドに格納されます。これは、そのスコープがAppDomain全体であることを意味します。SSISは、パッケージの実行ごとに1つのAppDomainを使用するため、値はパッケージ全体に影響します。

FindServicePointを使用して単一のホストの接続制限のみを変更する場合は、ホストアドレスのServicePointを作成し、このアドレスのみに制限を設定できます。

var myTarget= ServicePointManager.FindServicePoint(new Uri("http://www.google.com"));
myTarget.ConnectionLimit = 10;
于 2012-06-05T11:36:54.823 に答える
1
  1. すべてのタスクとサブタスクのタイムアウトを延長してみてください。

  2. 尋ねられませんでしたが、SSISを使用する代わりに、このようなタスクをハードコーディングしました。SSISはETLに最適ですが、それ以外はあまりありません。

于 2012-06-04T20:58:50.897 に答える