จะสร้างคำขอ 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 ของฉันมากขึ้น -- เช่น โพสต์ด้วยเนื้อหาคำขอเฉพาะซึ่ง 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;
}

ด้วยวิธีนี้ webClient จะไม่ค้าง และคุณยังไม่ต้องพึ่งพาไดเรกทอรี C:\Temp ที่มีอยู่ก่อนหน้านี้ นอกจากนั้นคำตอบที่ยอดเยี่ยมจาก @ user756519 มีรายละเอียดมาก

person RASMiranda    schedule 05.05.2013
comment
สวัสดี โปรดให้เราดาวน์โหลดไฟล์จากเว็บไซต์ที่ต้องการชื่อผู้ใช้และรหัสผ่านเพื่อให้ฉันมีผู้ใช้และรหัสผ่าน แต่ฉันไม่รู้ว่าจะส่งผ่านไปยังโปรแกรมได้อย่างไร - person ARAZI; 06.06.2019

นี่คือสองสามตัวเลือก:

  1. เครื่องมือของบุคคลที่สาม เช่น CozyRoc หรือ BlueSSIS
  2. งานสคริปต์ด้วย WebClient
  3. งานสคริปต์ด้วย HTTP Connection Manager

ตัวอย่างงานสคริปต์ที่: http://microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html

person Joost    schedule 05.11.2011
comment
ฉันคิดว่านี่เป็นจุดประสงค์ของ HTTP Connection Manager แต่ถึงแม้คุณจะระบุว่าเป็นตัวเลือกที่สามก็ตาม เหตุใดจึงไม่ใช่ตัวเลือกที่ต้องดำเนินการ? - person Thronk; 26.09.2013
comment
ข้อเสียของ HTTP Connection Manager คือไม่รองรับ WIndows Authentication - person Paul Hatcher; 15.01.2016