Как сделать HTTP-запрос от SSIS?

Мне интересно узнать, как я могу сделать HTTP-вызов из SSIS. Например, я хотел бы иметь возможность загрузить файл с http://www.domain.com/resource.zip и записать дату и время загрузки и место назначения файла на диске. Я также хотел бы зафиксировать такие атрибуты, как размер файла, и зафиксировать дату и время завершения загрузки.


person tap    schedule 13.07.2011    source источник
comment
Этот ответ отличный, но как мне получить такие вещи, как размер файла, из загруженного Uri? Мне нужно будет обновить таблицу источников с информацией о размере файла после ее завершения.   -  person tap    schedule 14.07.2011
comment
Я не понимаю, как это не встроено в инструмент ETL...   -  person Neil McGuigan    schedule 05.06.2016


Ответы (3)


Вы можете использовать пространство имен System.Net.WebClient для выполнения HTTP-запроса с помощью Script Task в службах SSIS. Следующий пример показывает, как этого можно достичь. Пример был создан в SSIS 2008 R2.

Пошаговый процесс:

  1. Создайте новый пакет SSIS и создайте две переменные, а именно RemoteUri и LocalFolder. Задайте для переменной RemoteUri значение http://www.google.com/intl/en_com/images/srpr/logo1w.png. это URL-адрес изображения логотипа на главной странице Google. Задайте для переменной LocalFolder значение C:\temp\. это путь, по которому мы собираемся сохранить содержимое. См. снимок экрана №1.

  2. В пакете SSIS поместите файл Script Task. Замените метод Main() в задаче скрипта кодом из раздела Код задачи скрипта. См. снимок экрана №2.

  3. На снимке экрана № 3 показано, что путь C:\temp\ пуст.

  4. На снимке экрана №4 показано успешное выполнение пакета.

  5. На снимке экрана № 5 показано, что содержимое (в данном случае изображение логотипа) было загружено по пути к локальной папке.

  6. На снимке экрана № 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:

1

Скриншот 2.

2

Скриншот №3:

3

Скриншот № 4:

4

Скриншот № 5:

5

Скриншот № 6:

6

person Community    schedule 13.07.2011
comment
Это полезно, но я хотел бы больше контролировать свой HTTP-запрос, например. POST с конкретным телом запроса, что System.Net.WebClient, по-видимому, не может сделать. - person Roy Tinker; 04.09.2013
comment
Здравствуйте, пожалуйста, можем ли мы загрузить файл с веб-сайта, для которого требуется пользователь и пароль, чтобы указать, что у меня есть пользователь и пароль, но я не знаю, как передать его в программу? - person ARAZI; 06.06.2019

Просто альтернатива скрипту @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, очень подробный.

person RASMiranda    schedule 05.05.2013
comment
Здравствуйте, пожалуйста, можем ли мы загрузить файл с веб-сайта, для которого требуется пользователь и пароль, чтобы указать, что у меня есть пользователь и пароль, но я не знаю, как передать его в программу? - person ARAZI; 06.06.2019

Вот несколько вариантов:

  1. Сторонние инструменты, такие как CozyRoc или BlueSSIS.
  2. Задание сценария с WebClient
  3. Задача сценария с диспетчером HTTP-соединений

Примеры задач сценария по адресу: http://microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html

person Joost    schedule 05.11.2011
comment
Я думал, что это было целью диспетчера HTTP-соединений, но даже вы указали его как третий вариант. Почему это не выходной вариант? - person Thronk; 26.09.2013
comment
Недостатком диспетчера HTTP-соединений является то, что он не поддерживает аутентификацию WIndows. - person Paul Hatcher; 15.01.2016