Мне интересно узнать, как я могу сделать HTTP-вызов из SSIS. Например, я хотел бы иметь возможность загружать файл из http://www.domain.com/resource.zip
и записывать дату и время загрузки и место назначения файла на диске. Я также хотел бы захватить такие атрибуты, как размер файла, и зафиксировать дату и время завершения загрузки.
Как сделать запрос HTTP из SSIS?
Ответ 1
Вы можете использовать пространство имен System.Net.WebClient
, чтобы сделать запрос Http с помощью Script Task
в SSIS. В следующем примере показано, как это можно достичь. Пример был создан в SSIS 2008 R2
.
Шаг за шагом:
-
Создайте новый пакет SSIS и создайте две переменные: RemoteUri и LocalFolder. Задайте переменную
RemoteUri
со значениемhttp://www.google.com/intl/en_com/images/srpr/logo1w.png
. это URL-адрес изображения на главной странице Google. Установите переменнуюLocalFolder
со значениемC:\temp\
. это путь, по которому мы собираемся сохранить контент. См. Снимок экрана # 1. -
В пакете SSIS поместите
Script Task
. Замените метод Main() в задаче script кодом, указанным в разделе Script Код задачи. См. Снимок экрана # 2. -
Снимок экрана # 3 показывает, что путь
C:\temp\
пуст. -
Снимок экрана # 4 показывает успешное выполнение пакета.
-
Снимок экрана # 5 показывает, что содержимое (в данном случае изображение логотипа) было загружено на путь локальной папки.
-
Снимок экрана # 6 показывает, что код был протестирован для загрузки ZIP файла. Для этого значение переменной RemoteUri было изменено с помощью URL-адреса контента, который необходимо загрузить.
Script код задачи:
С#, который может использоваться только в 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:
Ответ 2
Просто альтернатива для @user756519 script, не такая быстрая, но более пуленепробиваемая
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.
- Script Задача с WebClient
- Script Задача с диспетчером соединений HTTP
Script Примеры задач: http://microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html