Как сделать HTTP-запрос от SSIS? - PullRequest
30 голосов
/ 13 июля 2011

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

Ответы [ 3 ]

32 голосов
/ 13 июля 2011

Вы можете использовать пространство имен 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

7 голосов
/ 05 мая 2013

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

5 голосов
/ 06 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...