2011-07-13 29 views
25

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?

+0

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

+1

No entiendo cómo esto no está incorporado en una herramienta de ETL ... –

Respuesta

30

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:

  1. crear un nuevo paquete SSIS y crear dos variables a saber RemoteUri y carpetalocal. Establezca la variable RemoteUri con el valor http://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 variable LocalFolder con el valor C:\temp\. este es el camino donde vamos a guardar el contenido. Consulte la captura de pantalla # .

  2. 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.º .

  3. La captura de pantalla n.º muestra que la ruta C:\temp\ está vacía.

  4. La captura de pantalla n.º muestra la ejecución exitosa del paquete.

  5. 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.

  6. 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:

1

Captura de pantalla # 2:

2

Captura de pantalla # 3:

3

Captura de pantalla # 4:

4

Captura de pantalla # 5:

5

pantalla # 6:

6

+1

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. –

5

Aquí hay un par de opciones:

  1. herramientas de terceros, como CozyRoc o BlueSSIS.
  2. tarea Script con el cliente Web
  3. tarea Script con HTTP Connection Manager
Ejemplos

tarea Script en: http://microsoft-ssis.blogspot.com/2011/05/download-source-file-from-website-with.html

+1

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

+0

La desventaja de HTTP Connection Manager es que no es compatible con la Autenticación de Windows –

6

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.

Cuestiones relacionadas