Мне интересно узнать, как я могу сделать HTTP-вызов из SSIS. Например, я хотел бы иметь возможность загрузить файл с http://www.domain.com/resource.zip
и записать дату и время загрузки и место назначения файла на диске. Я также хотел бы зафиксировать такие атрибуты, как размер файла, и зафиксировать дату и время завершения загрузки.
Как сделать HTTP-запрос от SSIS?
Ответы (3)
Вы можете использовать пространство имен 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() в задаче скрипта кодом из раздела Код задачи скрипта. См. снимок экрана №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:
Просто альтернатива скрипту @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;
}
Таким образом, веб-клиент не зависает, а также вы не зависите от предыдущего существования каталога C:\Temp. Кроме этого, отличный ответ от @user756519, очень подробный.
Вот несколько вариантов:
- Сторонние инструменты, такие как CozyRoc или BlueSSIS.
- Задание сценария с WebClient
- Задача сценария с диспетчером HTTP-соединений
Примеры задач сценария по адресу: http://microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html