Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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:

1

Снимок экрана №2:

2

Снимок экрана №3: ​​

3

Снимок экрана №4:

4

Снимок экрана № 5:

5

Снимок экрана № 6:

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, очень подробный.