ฉันสนใจที่จะรู้ว่าฉันสามารถโทร HTTP จาก SSIS ได้อย่างไร ตัวอย่างเช่น ฉันต้องการที่จะดาวน์โหลดไฟล์จาก http://www.domain.com/resource.zip
และบันทึกวันที่และเวลาของการดาวน์โหลดและปลายทางของไฟล์ในไดรฟ์ ฉันยังต้องการบันทึกคุณลักษณะต่างๆ เช่น ขนาดไฟล์ และบันทึกวันที่ & เวลาที่การดาวน์โหลดเสร็จสิ้น
จะสร้างคำขอ HTTP จาก SSIS ได้อย่างไร
คำตอบ (3)
คุณสามารถใช้เนมสเปซ 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() ภายในงานสคริปต์ด้วยโค้ดที่ให้ไว้ใต้ส่วน โค้ดงานสคริปต์ อ้างอิงภาพหน้าจอ #2ภาพหน้าจอ #3 แสดงว่าเส้นทาง
C:\temp\
ว่างเปล่าภาพหน้าจอ #4 แสดงการดำเนินการแพคเกจที่ประสบความสำเร็จ
ภาพหน้าจอ #5 แสดงว่าเนื้อหา (ในกรณีนี้คือรูปภาพโลโก้) ได้รับการดาวน์โหลดไปยังเส้นทางโฟลเดอร์ในเครื่องแล้ว
ภาพหน้าจอ #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:
ภาพหน้าจอ #2:
ภาพหน้าจอ #3:
ภาพหน้าจอ #4:
ภาพหน้าจอ #5:
ภาพหน้าจอ #6:
เป็นทางเลือกสำหรับสคริปต์ @ 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 มีรายละเอียดมาก
นี่คือสองสามตัวเลือก:
- เครื่องมือของบุคคลที่สาม เช่น CozyRoc หรือ BlueSSIS
- งานสคริปต์ด้วย WebClient
- งานสคริปต์ด้วย HTTP Connection Manager
ตัวอย่างงานสคริปต์ที่: http://microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html