SSISからHTTP呼び出しを行う方法を知りたいです。たとえば、http://www.domain.com/resource.Zip
からファイルをダウンロードし、ダウンロードの日時とファイルの宛先をドライブに記録できるようにします。また、ファイルサイズなどの属性をキャプチャし、ダウンロードが完了した日時をキャプチャしたいと思います。
名前空間System.Net.WebClient
を使用して、SSISのScript Task
を使用してHttp要求を作成できます。次の例は、これを実現する方法を示しています。サンプルはSSIS 2008 R2
で作成されました。
ステップバイステップのプロセス:
新しいSSISパッケージを作成し、2つの変数、つまりRemoteUriとLocalFolderを作成します。変数RemoteUri
に値http://www.google.com/intl/en_com/images/srpr/logo1w.png
を設定します。これは、Googleのホームページ上のロゴの画像URLです。変数LocalFolder
に値C:\temp\
を設定します。これがコンテンツを保存するパスです。スクリーンショット#1を参照してください。
SSISパッケージで、Script Task
を配置します。スクリプトタスク内のMain()メソッドをScript Task Codeセクションで提供されるコードに置き換えます。スクリーンショット#2を参照してください。
スクリーンショット#は、パスC:\temp\
が空であることを示しています。
スクリーンショット#4は、パッケージの正常な実行を示しています。
スクリーンショット#5は、コンテンツ(この場合はロゴ画像)がローカルフォルダーパスにダウンロードされたことを示しています。
スクリーンショット#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:
スクリーンショット#2:
スクリーンショット#3:
スクリーンショット#4:
スクリーンショット#5:
スクリーンショット#6:
@ 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からの非常に詳細な回答です。
以下にいくつかのオプションを示します。
スクリプトタスクの例: http://Microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html