如何从 SSIS 发出 HTTP 请求?
Posted
技术标签:
【中文标题】如何从 SSIS 发出 HTTP 请求?【英文标题】:How to make an HTTP request from SSIS? 【发布时间】:2011-10-04 18:53:45 【问题描述】:我很想知道如何从 SSIS 发起 HTTP 调用。例如,我希望能够从http://www.domain.com/resource.zip
下载文件并记录下载的日期时间和驱动器上文件的目的地。我还想捕获文件大小等属性并捕获下载完成的日期和时间。
【问题讨论】:
这个答案很棒,但是我如何从下载的 Uri 中获取文件大小之类的东西?完成后,我需要使用文件大小信息更新源表 我不明白这不是 ETL 工具内置的... 【参考方案1】:您可以使用命名空间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 的值被更改为需要下载的内容 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:
【讨论】:
这很有帮助,但我想更好地控制我的 HTTP 请求——例如POST 带有特定的请求正文,System.Net.WebClient 显然不能这样做。 你好,请问我们可以从需要用户名和密码的网站下载文件吗?我有用户名和密码,但我不知道如何将其传递到程序中?【参考方案2】:只是@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 的回答很好,非常详细。
【讨论】:
你好,请问我们可以从需要用户名和密码的网站下载文件吗?我有用户名和密码,但我不知道如何将其传递到程序中?【参考方案3】:这里有几个选项:
-
第三方工具,例如 CozyRoc 或 BlueSSIS。
使用 WebClient 编写任务脚本
使用 HTTP 连接管理器编写任务
脚本任务示例位于: http://microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html
【讨论】:
我认为这是 HTTP 连接管理器的目的,但即使您将其列为第三选择。为什么这不是首选选项? HTTP 连接管理器的缺点是它不支持 WIndows 身份验证以上是关于如何从 SSIS 发出 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Google Assistant 发出局域网 HTTP 请求?
如何从 Azure 函数内部发出基于承诺的 HTTP 发布请求 (NodeJS)?