Bagaimana cara membuat permintaan HTTP dari SSIS?

Saya tertarik mengetahui cara melakukan panggilan HTTP dari SSIS. Misalnya, saya ingin mengunduh file dari http://www.domain.com/resource.zip dan mencatat tanggal waktu pengunduhan dan tujuan file di drive. Saya juga ingin menangkap atribut seperti ukuran file dan menangkap tanggal & waktu pengunduhan selesai.


person tap    schedule 13.07.2011    source sumber
comment
Jawaban ini bagus, tetapi bagaimana saya mendapatkan ukuran file dari Uri yang diunduh? Saya perlu memperbarui tabel sumber dengan informasi ukuran file setelah selesai   -  person tap    schedule 14.07.2011
comment
Saya tidak mengerti bagaimana ini tidak ada di dalam alat ETL...   -  person Neil McGuigan    schedule 05.06.2016


Jawaban (3)


Anda dapat menggunakan namespace System.Net.WebClient untuk membuat permintaan Http dengan bantuan Script Task di SSIS. Contoh berikut menunjukkan bagaimana hal ini dapat dicapai. Contohnya dibuat di SSIS 2008 R2.

Proses langkah demi langkah:

  1. Buat paket SSIS baru dan buat dua variabel yaitu RemoteUri dan LocalFolder. Atur variabel RemoteUri dengan nilai http://www.google.com/intl/en_com/images/srpr/logo1w.png. ini adalah url gambar logo di beranda Google. Atur variabel LocalFolder dengan nilai C:\temp\. ini adalah jalur dimana kita akan menyimpan konten. Lihat tangkapan layar #1.

  2. Pada paket SSIS, tempatkan Script Task. Ganti metode Main() dalam tugas skrip dengan kode yang disediakan di bagian Kode Tugas Skrip. Lihat tangkapan layar #2.

  3. Tangkapan layar #3 menunjukkan bahwa jalur C:\temp\ kosong.

  4. Tangkapan layar #4 menunjukkan eksekusi paket yang berhasil.

  5. Tangkapan layar #5 menunjukkan bahwa konten (dalam hal ini gambar logo) telah diunduh ke jalur folder lokal.

  6. Tangkapan layar #6 menunjukkan bahwa kode tersebut diuji untuk mengunduh file .zip. Untuk mencapai hal ini, nilai variabel RemoteUri diubah dengan url konten yang perlu diunduh.

Kode tugas skrip:

Kode C# yang hanya dapat digunakan di 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;
}

Tangkapan Layar #1:

1

Tangkapan layar #2:

2

Tangkapan Layar #3:

3

Tangkapan Layar #4:

4

Tangkapan Layar #5:

5

Tangkapan Layar #6:

6

person Community    schedule 13.07.2011
comment
Ini berguna, tetapi saya ingin kontrol lebih besar atas permintaan HTTP saya -- mis. POST dengan badan permintaan tertentu, yang tampaknya tidak dapat dilakukan oleh System.Net.WebClient. - person Roy Tinker; 04.09.2013
comment
halo tolong bisakah kita mengunduh file dari situs web yang memerlukan pengguna dan kata sandi untuk memberikan saya memiliki pengguna dan kata sandi tetapi saya tidak tahu bagaimana cara memasukkannya ke dalam program? - person ARAZI; 06.06.2019

Sekadar alternatif skrip @ user756519, tidak secepat, tapi lebih antipeluru

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;
}

Dengan cara ini, webClient tidak hang, dan Anda juga tidak bergantung pada keberadaan direktori C:\Temp sebelumnya. Selain itu, jawaban bagus dari @ user756519, sangat detail.

person RASMiranda    schedule 05.05.2013
comment
halo tolong bisakah kita mengunduh file dari situs web yang memerlukan pengguna dan kata sandi untuk memberikan saya memiliki pengguna dan kata sandi tetapi saya tidak tahu bagaimana cara memasukkannya ke dalam program? - person ARAZI; 06.06.2019

Berikut beberapa opsi:

  1. Alat pihak ketiga seperti CozyRoc atau BlueSSIS.
  2. Tugas Skrip dengan WebClient
  3. Tugas Skrip dengan Manajer Koneksi HTTP

Contoh Tugas Skrip di: http://microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html

person Joost    schedule 05.11.2011
comment
Saya pikir ini adalah tujuan dari HTTP Connection Manager, tetapi bahkan Anda mencantumkannya sebagai pilihan ketiga. Mengapa ini bukan pilihan utama? - person Thronk; 26.09.2013
comment
Kelemahan dari Manajer Koneksi HTTP adalah tidak mendukung Otentikasi WIndows - person Paul Hatcher; 15.01.2016