Me interesa saber cómo puedo hacer una llamada HTTP desde SSIS. Por ejemplo, me gustaría poder descargar un archivo desde http://www.domain.com/resource.zip
y registrar la fecha de la descarga y el destino del archivo en la unidad. También me gustaría capturar atributos como el tamaño del archivo y capturar la fecha & cuando finaliza la descarga.¿Cómo hacer una solicitud HTTP desde SSIS?
Respuesta
Puede hacer uso del espacio de nombres System.Net.WebClient
para realizar la solicitud Http con la ayuda de Script Task
en SSIS. El siguiente ejemplo muestra cómo se puede lograr esto. El ejemplo fue creado en SSIS 2008 R2
.
proceso paso a paso:
crear un nuevo paquete SSIS y crear dos variables a saber RemoteUri y carpetalocal. Establezca la variable
RemoteUri
con el valorhttp://www.google.com/intl/en_com/images/srpr/logo1w.png
. esta es la URL de la imagen del logotipo en la página de inicio de Google. Establezca la variableLocalFolder
con el valorC:\temp\
. este es el camino donde vamos a guardar el contenido. Consulte la captura de pantalla # .En el paquete SSIS, coloque un
Script Task
. Reemplace el método Main() dentro de la tarea de script con el código proporcionado en la sección Script Task Code. Consulte la captura de pantalla n.º .La captura de pantalla n.º muestra que la ruta
C:\temp\
está vacía.La captura de pantalla n.º muestra la ejecución exitosa del paquete.
La captura de pantalla muestra que el contenido (en este caso, la imagen del logotipo) se ha descargado a la ruta de la carpeta local.
La captura de pantalla # muestra que el código fue probado para descargar un archivo .zip. Para lograr esto, el valor de la variable RemoteUri se modificó con la URL de contenido que debe descargarse.
escritura de código tarea:
C# código que puede ser utilizado sólo en 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;
}
Captura de pantalla # 1:
Captura de pantalla # 2:
Captura de pantalla # 3:
Captura de pantalla # 4:
Captura de pantalla # 5:
pantalla # 6:
Esto es útil, pero me gustaría tener más control sobre mi solicitud HTTP, por ejemplo POST con un cuerpo de solicitud particular, que System.Net.WebClient aparentemente no puede hacer. –
Aquí hay un par de opciones:
- herramientas de terceros, como CozyRoc o BlueSSIS.
- tarea Script con el cliente Web
- tarea Script con HTTP Connection Manager
tarea Script en: http://microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html
Pensé que este era el propósito del HTTP Connection Manager, pero incluso usted lo menciona como la tercera opción. ¿Por qué esta no es la opción de ir a buscar? – Thronk
La desventaja de HTTP Connection Manager es que no es compatible con la Autenticación de Windows –
sólo una alternativa para @ user756519 guión, no tan rápido, pero más a prueba de balas
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;
}
De esta manera, webClient no se queda colgando, y además no dependes de la anterior existencia del directorio C: \ Temp. Aparte de eso, gran respuesta de @ user756519, muy detallada.
- 1. ¿Cómo hacer una solicitud HTTP PUT?
- 2. ¿Se puede hacer una solicitud HTTP PATCH desde Javascript?
- 3. Hacer una solicitud HTTP con android
- 4. cómo publicar una solicitud HTTP desde la línea de comando
- 5. ¿Cómo hacer una solicitud HTTP usando Ruby on Rails?
- 6. ¿Cómo hacer una solicitud HTTP PUT utilizando LWP?
- 7. ¿Cómo hacer una solicitud HTTP Post/GET en Powershell?
- 8. Cómo escribir una solicitud HTTP
- 9. ¿Cómo hacer una solicitud HTTP HEAD desde la línea de comandos de Windows?
- 10. ¿Cómo hacer una solicitud/llamada HTTP con la carga útil JSON desde la línea de comandos?
- 11. ¿Es posible hacer una solicitud JSONP de HTTPS a HTTP?
- 12. para una solicitud HTTP
- 13. ¿Cómo puedo hacer una solicitud http sin obtener una respuesta http en Python?
- 14. Generar una solicitud posterior a HTTP desde el controlador
- 15. Enviar una solicitud DELETE HTTP
- 16. Cómo hacer caché por solicitud http en ASP.NET 3.5
- 17. cómo hacer la solicitud HTTP GET en Android
- 18. ¿Cómo enviar una solicitud HTTP en Java?
- 19. Cómo analizar una solicitud HTTP en Java?
- 20. ¿Cómo responder a una solicitud HTTP OPTIONS?
- 21. telnet enviar una solicitud HTTP
- 22. ¿Cómo hacer la solicitud de keepalive http con curl?
- 23. ¿Cómo ejecutar un paquete SSIS desde .NET?
- 24. solicitud HTTP DELETE
- 25. ¿Cómo enviar una solicitud GET desde PHP?
- 26. Cómo simular una solicitud HTTP Post desde una vista django sin una plantilla
- 27. Cómo detener SSIS desde "Llamar a casa"
- 28. ¿Cómo creo una solicitud de cliente HTTP con una cookie?
- 29. ¿Cómo puedo enviar una solicitud de eliminación http del navegador?
- 30. Solicitud HTTP en Ubuntu
Esta respuesta es genial, pero ¿cómo obtendría cosas como el tamaño de archivo del Uri descargado? Necesitaré actualizar la tabla de fuentes con la información del tamaño del archivo una vez que haya completado – tap
No entiendo cómo esto no está incorporado en una herramienta de ETL ... –