我很想知道如何从SSIS进行HTTP调用。例如,我希望能够从http://www.domain.com/resource.zip
下载文件,并在驱动器上记录下载的日期时间和文件的目标。我还想捕获文件大小等属性并捕获日期和时间。下载完成的时间。
答案 0 :(得分:31)
您可以利用命名空间System.Net.WebClient
在SSIS中借助Script Task
来发出Http请求。以下示例显示了如何实现这一目标。该示例是在SSIS 2008 R2
。
分步流程:
创建一个新的SSIS包并创建两个变量,即 RemoteUri 和 LocalFolder 。将变量RemoteUri
设置为值http://www.google.com/intl/en_com/images/srpr/logo1w.png
。这是Google主页上徽标的图片网址。将变量LocalFolder
设置为值C:\temp\
。这是我们要保存内容的路径。请参阅屏幕截图# 1 。
在SSIS包中,放置Script Task
。使用脚本任务代码部分下提供的代码替换脚本任务中的Main()方法。请参阅屏幕截图# 2 。
屏幕截图# 3 表示路径C:\temp\
为空。
屏幕截图# 4 显示包的成功执行。
屏幕截图# 5 显示内容(在本例中为徽标图片)已下载到本地文件夹路径。
屏幕截图# 6 显示代码已经过测试,可以下载.zip文件。为此,使用需要下载的内容网址更改了变量 RemoteUri 的值。
脚本任务代码:
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:
答案 1 :(得分:7)
只是@ 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的答案非常详细。
答案 2 :(得分:5)
以下是几个选项:
脚本任务示例: http://microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html