jueves, 27 de octubre de 2011

Cómo subir un documento a Sharepoint rápidamente con Servicios Web

Cuando queremos utilizar Sharepoint como repositorio de documentos de nuestras aplicaciones, lo primero que tenemos que decidir es cómo queremos conectar con el servidor para almacenar dichos documentos. La decisión en sí no es muy complicada, aunque sí es cierto que dependerá de factores como arquitectura, formas de conexión, seguridad, etc…
En este artículo vamos a desarrollar paso a paso una función de ‘Upload’ utilizando los servicios web nativos de Sharepoint, en su versión 2010. Esta aproximación es la más sencilla de implementar y a continuación veremos cómo

Añadir la referencia web

Como comentaba más arriba, vamos a subir documentación a un servidor de Sharepoint mediante los Servicios Web nativos; en consecuencia, lo primero que tenemos que hacer es añadir la referencia web correspondiente en nuestro proyecto. En el ejemplo realizado se ha utilizado Visual Studio 2010, pero es perfectamente válido también para versiones anteriores.
  1. Sobre el proyecto, clic con el botón derecho del ratón, “Add Service Reference”

    image
  2. Para añadir la referencia web, hacemos clic en el botón “Advanced” y a continuación en el botón “Add Web Reference”

    image

    image
  3. En la caja de texto “URL:” introducimos la url de acceso al servicio web de Sharepoint que nos permitirá subir documentos. Dentro de todos los servicios web que proporciona Sharepoint, el que nos interesa en esta ocasión es “Copy.asmx” y como el resto de los servicios web está alojado en la carpeta “_vti_bin” en este ejemplo vamos a utilizar como ruta para la referencia “http://srvmv07/_vti_bin/copy.asmx
  4. Una vez que la ventana anterior nos ha comprobado la referencia, le damos un nombre (en el ejemplo “WSCopy”) y hacemos clic en “Add Reference” para incluir la referencia en el proyecto.

    image
En este ejemplo, vamos a trabajar con dos parámetros en el archivo de configuración. Uno indicará el sitio de Sharepoint donde queremos subir el documento (“WebUrl”) en formato http://servidor/sitio y el otro indicará la biblioteca de destino (“DocumentLibraryDestination”)

Al turrón

  1. Instanciamos el servicio web:
    //Configuración del Servicio Web         
    WSCopy.Copy copyService = new WSCopy.Copy();         
    copyService.Url = Properties.Settings.Default.WebUrl + "/_vti_bin/copy.asmx";         
    copyService.Credentials = System.Net.CredentialCache.DefaultCredentials;      
    Como podemos ver en el fragmento de código, en este ejemplo estamos utilizando las credenciales por defecto del usuario que está ejecutando el programa. Más adelante veremos cómo actuar si dicho usuario no tendrá permisos sobre la carpeta de destino.
  2. Preparamos los objetos necesarios para realizar el Upload:
    //Declare and initiates the Copy WebService members for uploading       
    string sourcePath = “Ruta completa al archivo a publicar”;       
    string[] destinationUrl = {       
                               Properties.Settings.Default.WebUrl + "/" +       
                               Properties.Settings.Default.DocumentLibraryDestination + "/" +       
                               “Nombre del archivo”       
                               };       
    WSCopy.CopyResult cResult1 = new WSCopy.CopyResult();       
    WSCopy.CopyResult cResult2 = new WSCopy.CopyResult();       
    WSCopy.CopyResult[] cResultArray = { cResult1, cResult2 };       
    WSCopy.FieldInformation fFiledInfo = new WSCopy.FieldInformation();       
    WSCopy.FieldInformation[] fFiledInfoArray = { fFiledInfo };     
    En este fragmento, la parte más relevante está en las últimas dos instrucciones, ya que nos permitirán, completando el código, establecer los valores de metadatos del documento en Sharepoint. De momento no vamos a publicar ningún atributo, así que lo dejamos como está.
  3. Abrimos el archivo que vamos a ‘subir’ y lo convertimos en un array de Bytes, que será lo que tendremos que enviar al servicio web como parámetro:
    //Reading the document contents in to stream       
    FileStream strm = new FileStream(sourcePath, FileMode.Open, FileAccess.Read);       
    byte[] fileContents = new Byte[strm.Length];       
    byte[] r = new Byte[strm.Length];       
    int ia = strm.Read(fileContents, 0, Convert.ToInt32(strm.Length));       
    strm.Close();
  4. Invocamos a la función “CopyIntoItems” del Servicio Web para realizar el upload y… listo!

    uint copyresult = copyService.CopyIntoItems(sourcePath, destinationUrl, fFiledInfoArray, fileContents, out cResultArray);

    Ojo con esta última parte, ay que según la documentación, la función devolverá “0” si todo a ido bien, y otro valor si ha habido algún problema; sin embargo, la manera de comprobar si todo ha ido bien es mediante el parámetro de vuelta “cResultArray”

Realizar el Upload sin permisos en la biblioteca de destino


En muchas ocasiones, las bibliotecas de Sharepoint que se utilizan como repositorio de aplicaciones tienen especificada una seguridad específica para evitar que el acceso a esa documentación se realice desde ‘fuera’ de las aplicaciones concretas. Para poder realizar el upload en estos casos, tendremos que disponer de una cuenta de acceso ‘genérica’ a la biblioteca con los permisos mínimos para poder subir documentación, y utilizar esa cuenta en la configuración de las credenciales del servicio web:
copyService.Credentials = new System.Net.NetworkCredential("user","pwd","domain");
 
Cuidado porque esta práctica provoca que en la biblioteca de documentos el usuario que aparece como última modificación será ese usuario genérico.

Modificar propiedades del documento


Las bibliotecas de Sharepoint pueden contener propiedades o atributos que etiquetan al contenido de las mismas. Para poder aplicar valor a esas propiedades al reaalizar el upload de un documento, tendremso que ‘jugar’ con la clase “FieldInformation” que comentaba más arriba:
fFiledInfo.DisplayName = "Nombre del atributo";
fFiledInfo.Type = WSCopy.FieldType.Text;//Tipo
fFiledInfo.Value = "valor";
 

Adjuntos

Descargar

2 comentarios:

Salo RW dijo...

Muy útil y bastante bien explicado !!!

Muchas gracias, me salvaste!! Saludos!!

hilbert dijo...

justo lo que estaba buscando, muchas gracias. Espero sigas publicando nuevos articulos