web-dev-qa-db-ja.com

SSISからHTTPリクエストを作成する方法は?

SSISからHTTP呼び出しを行う方法を知りたいです。たとえば、http://www.domain.com/resource.Zipからファイルをダウンロードし、ダウンロードの日時とファイルの宛先をドライブに記録できるようにします。また、ファイルサイズなどの属性をキャプチャし、ダウンロードが完了した日時をキャプチャしたいと思います。

30
tap

名前空間System.Net.WebClientを使用して、SSISのScript Taskを使用してHttp要求を作成できます。次の例は、これを実現する方法を示しています。サンプルはSSIS 2008 R2で作成されました。

ステップバイステップのプロセス:

  1. 新しいSSISパッケージを作成し、2つの変数、つまりRemoteUriLocalFolderを作成します。変数RemoteUriに値http://www.google.com/intl/en_com/images/srpr/logo1w.pngを設定します。これは、Googleのホームページ上のロゴの画像URLです。変数LocalFolderに値C:\temp\を設定します。これがコンテンツを保存するパスです。スクリーンショット#1を参照してください。

  2. SSISパッケージで、Script Taskを配置します。スクリプトタスク内のMain()メソッドをScript Task Codeセクションで提供されるコードに置き換えます。スクリーンショット#2を参照してください。

  3. スクリーンショット#は、パスC:\temp\が空であることを示しています。

  4. スクリーンショット#4は、パッケージの正常な実行を示しています。

  5. スクリーンショット#5は、コンテンツ(この場合はロゴ画像)がローカルフォルダーパスにダウンロードされたことを示しています。

  6. スクリーンショット#6は、.Zipファイルをダウンロードするためにコードがテストされたことを示しています。これを実現するために、変数RemoteUriの値は、ダウンロードする必要があるコンテンツURLで変更されました。

スクリプトタスクコード:

C#SSIS 2008 and aboveでのみ使用できるコード。

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::RemoteUri");
    Dts.VariableDispenser.LockForRead("User::LocalFolder");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    System.Net.WebClient myWebClient = new System.Net.WebClient();
    string webResource = varCollection["User::RemoteUri"].Value.ToString();
    string fileName = varCollection["User::LocalFolder"].Value.ToString() + webResource.Substring(webResource.LastIndexOf('/') + 1);
    myWebClient.DownloadFile(webResource, fileName);

    Dts.TaskResult = (int)ScriptResults.Success;
}

スクリーンショット#1:

1

スクリーンショット#2:

2

スクリーンショット#3:

3

スクリーンショット#4:

4

スクリーンショット#5:

5

スクリーンショット#6:

6

32
user756519

@ user756519スクリプトの代替にすぎず、高速ではありませんが、より安全です

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::RemoteUri");
    Dts.VariableDispenser.LockForRead("User::LocalFolder");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    System.Net.WebClient myWebClient = new System.Net.WebClient();
    string webResource = varCollection["User::RemoteUri"].Value.ToString();
    string fileName = varCollection["User::LocalFolder"].Value.ToString() + webResource.Substring(webResource.LastIndexOf('/') + 1);

    byte[] data;
    using (WebClient client = new WebClient())
    {
        data = client.DownloadData(webResource);
    }
    FileInfo file = new System.IO.FileInfo(fileName);
    file.Directory.Create(); // If the directory already exists, this method does nothing.
    File.WriteAllBytes(file.FullName, data);

    Dts.TaskResult = (int)ScriptResults.Success;
}

この方法では、webClientがハングしたままにならず、C:\ Tempディレクトリの以前の存在に依存しません。それ以外は、@ user756519からの非常に詳細な回答です。

7
RMiranda

以下にいくつかのオプションを示します。

  1. CozyRocやBlueSSISなどのサードパーティツール。
  2. WebClientを使用したスクリプトタスク
  3. HTTP接続マネージャーを使用したスクリプトタスク

スクリプトタスクの例: http://Microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html

5
Joost