Cómo acceder a servicios web de SharePoint en sitios que usan forms based authentication

Como muchos saben, hay una serie de servicios web que exponen tanto WSS 3.0 como MOSS 2007, los cuales pueden ser consumidos para realizar una diversa serie de acciones sobre los sitios SharePoint programáticamente. Sin embargo, algo que no es tan obvio, es el hecho de que cuando aquellos sitios no utilizan la autenticación basada en Windows, que es la predeterminada, sino que están configurados para usar autenticación basada en formas, o forms based authentication (FBA), se requieren pasos adicionales para hacer la invocación apropiadamente.

Si intentas la invocación y no utilizas las líneas adicionales que comento más abajo obtendrás una WebException con este mensaje:

The request failed with HTTP status 403: Forbidden.

Entonces, si por ejemplo deseas invocar al servicio web de listas (Lists.asmx) que expone SharePoint desde tu código C#, en un sitio que usa FBA, esto es lo que debes hacer:

// Autenticar
AuthenticationService.Authentication auth = new AuthenticationService.Authentication();
auth.CookieContainer = new CookieContainer();
AuthenticationService.LoginResult result = auth.Login("usuario", "contraseña");

if (result.ErrorCode == AuthenticationService.LoginErrorCode.NoError)
{
    // Crear el servicio de listas y asociarle la cookie 
    // retornada por el servicio de autenticación
    ListsService.Lists lists = new ListsService.Lists();
    CookieCollection cookies = auth.CookieContainer.GetCookies(new Uri(auth.Url));
    Cookie authCookie = cookies[result.CookieName];
    lists.CookieContainer = new CookieContainer();
    lists.CookieContainer.Add(authCookie);

    // Invocar al servicio de listas
    XmlNode responseNode = lists.GetListCollection();
    
    // Utilizar los datos retornados...
}

En este ejemplo, AuthenticationService y ListsService son referencias web a lo servicios de SharePoint que encontrarás en http://midominio.com/_vti_bin/authentication.asmx y http://midominio.com/_vti_bin/lists.asmx respectivamente.

El código lo que hace es invocar el servicio de autenticación utilizando un usuario y contraseña válidos en el contexto de este sitio que usa FBA. El resultado de esa autenticación contiene una cookie que es como el token que identificará a las sucesivas invocaciones a otros servicios web. Luego de verificar que no hubo errores al autenticar, se crea la instancia del servicio de listas, se le agrega la cookie obtenida a su contenedor de cookies y finalmente se invoca al servicio. Y listo, la llamada debe ejecutarse sin problemas.

Notas Importantes

  • El usuario que utilices para invocar al método Login de Authentication.asmx debe ser un usuario que forme parte del sitio que utiliza FBA, mas no puede ser uno de tus usuarios de Active Directory, es decir, no pueden ser usuarios de un sitio que use Windows Authentication. Authentication.asmx funciona únicamente para sitios que usen FBA.
  • El dominio de los servicios web que utilizarás no puede contener un puerto específico, pues en ese caso la cookie no funcionará. Es decir, si haces tus referencias web a http://midominio:12000, obtendrás un error al invocar al servicio de listas, más si usas http://midominio.com (que corre en el puerto 80) todo funcionará sin problemas.

Espero sea de utilidad,

Julio

¡SPSite no es un site!

Una pequeña nota acerca del modelo de objetos de SharePoint. Aunque ya lo he estado usando durante unos cuantos meses, recién ahora leyendo un excelente libro llamado Inside Microsoft Windows SharePoint Services 3.0, me he enterado de ciertas diferencias entre el nombramiento de objetos en el modelo de objetos de SharePoint y los elementos correspondientes que se utilizan en su UI.

Y es que SPSite pues no se refiere a un site de SharePoint, sino a un site collection, mientras que SPWeb tampoco se refiere a una Web Application como lo hubiera esperado, sino a un site!

Entonces, en el siguiente código:

  using Microsoft.SharePoint;

  class Program {
    static void Main() {
      string ruta = "http://misitio.com";

      SPSite siteCollection = new SPSite(ruta);
      
      SPWeb site = siteCollection.RootWeb;
      
      foreach (SPList lista in site.Lists) {
        Console.WriteLine(lista.Title);
      }
      
      site.Dispose();
      siteCollection.Dispose();
    }
  }

… pues estoy obteniendo primeramente una referencia al site collection del sitio (un SPSite), luego una referencia al sitio de nivel superior dentro de esa site collection (un SPWeb) y luego pues recorro las listas del sitio, despliego sus nombres en la consola y finalmente hago dispose de los objetos que lo requieren.

Aparentemente esto es un legado de el nombramiento de estos objetos en versiones pasadas de la plataforma. Seguramente es obvio para los masters en desarrollo con SharePoint, pero a mi me acaba de aclarar algunas dudas :)

Julio

Cambiando la vista inicial en tu Forma InfoPath programáticamente

Sí, en muchos casos podrás hacer ese cambio de vistas usando reglas de InfoPath, pero, tarde o temprano, te pasará como a mi y las reglas no serán suficiente para el tipo de personalización que tus usuarios demandan. Cómo le haces entonces para definir la vista inicial que debe mostrarse en la forma InfoPath programáticamente dependiendo de tus reglas de negocio?

Supongamos que tienes una forma InfoPath con 2 vistas: VistaCreacion y VistaAprobacion y que el mostrar una u otra vista depende del usuario que inició sesión en SharePoint.

Para agregar el código que cambie la vista inicial de la forma:

1. En InfoPath, selecciona el menú Tools –> Programming –> Loading Event…, lo cual abre el código C# de la forma y te sitúa en el manejador del evento Loading.

2. En el método FormEvents_Loading agrega las siguientes líneas:

public void FormEvents_Loading(object sender, LoadingEventArgs e)
{
    if (Application.User.LoginName.Equals(@"MiDominio\UnAprobador"))
        e.SetDefaultView("VistaAprobacion");
    else
        e.SetDefaultView("VistaCreacion");
}

Y listo. Una vez que hagas el deployment de tu forma ésta mostrará la vista apropiada dependiendo de quien inició sesión en el portal SharePoint.

Una nota personal: cada vez más prefiero usar código C# en vez de las reglas de InfoPath, principalmente porque las reglas suelen ser limitadas y complicadas cuando quieres resolver escenarios no tan simples. Más aún, cuando tienes muchas reglas y luego necesitas agregar también código C#, eso puede convertirse en una verdadera ensalada muy difícil de entender aún para ti mismo, menos aún para el pobre que deberá darle mantenimiento a tu forma más adelante.

Espero sea de utilidad,

Julio.

Conoce SharePoint Magazine

Aquí nada más para pasarles la noticia de este nuevo sitio, llamado sharepointmagazine.net, en el que se están presentando interesantes artículos relacionados con SharePoint.

SharePointMagazine

En este momento hay un artículo interesante sobre cómo se ve SharePoint en un dispositivo móvil como el iPhone, una entrevista con el muy conocido Joel Oleson y algunas otras cosas. Seguramente vendrá mucho más contenido en adelante.

Julio.

Nace la International SharePoint Professionals Association

ispa-med

Desde hace varios meses nos hemos venido juntando algunos entusiastas de las tecnologías SharePoint alrededor de todo el mundo y el día de hoy, gracias a los esfuerzos que ha liderado Bob Fox, MVP de SharePoint, ha nacido la International SharePoint Professionals Association (ISPA), una gran comunidad de profesionales voluntarios independientes que queremos difundir la voz acerca de SharePoint y guiar su adopción por todo el mundo.

Estamos muy contentos por poder dar inicio a esta nueva gran comunidad y quién mejor que Bob para introducirnos a esta iniciativa (el anuncio oficial en inglés está por acá):

“La Asociación Internacional de Profesionales de SharePoint, también conocida como ‘ISPA’ (por sus siglas en inglés), es una organización independiente, sin fines de lucro e impulsada por la comunidad dedicada a brindar soporte a profesionales y grupos de SharePoint alrededor del mundo. La misión primaria de ISPA es el promover la adopción global de las Tecnologías SharePoint proveyendo soporte y guías para la comunidad SharePoint como un todo – estableciendo conexiones entre los profesionales, grupos, recursos, educación e información de SharePoint. ISPA es liderado y soportado por voluntarios a través del mundo y se enfocará en llevar a toda la comunidad a estar mucho más unidos.

La primera oferta de la ISPA para la comunidad es brindar soporte a los grupos de usuarios alrededor del mundo a través de sitios web WSS v3 gratuitos para cada grupo que se afilie a la ISPA. Adicionalmente, uno de los objetivos de la ISPA es el facilitar un intercambio de ideas entre líderes de grupos de usuarios que ayuden a incrementar las posibilidades de éxito de sus grupos. Siendo así, ISPA está proveyendo a los líderes de los grupos de usuario del acceso a espacios colaborativos donde pueden interactuar con otros líderes de grupo, compartiendo ideas, recursos, mejores prácticas, guías y, más importante, brindarse soporte entre ellos.

ISPA también ha establecido Evangelistas Regionales – líderes de comunidad existentes que han exhibido previamente un compromiso fuerte hacia la promoción de la comunidad SharePoint y que se han comprometido a llevar el mensaje de ISPA a través de su región particular. Estos evangelistas son contactos locales clave que están disponibles para trabajar con profesionales locales de SharePoint y grupos de usuarios a través de su región para ayudar a promover la comunidad y SharePoint. Si estás interesado en iniciar un grupo de usuarios, tienes uno existente o necesitas guía – los Evangelistas Regionales de la ISPA son excelentes recursos que están disponibles para asistirte inmediatamente.

Finalmente, como todos saben, ninguna comunidad está completa sin un sitio web, y la ISPA se enorgullece en anunciar el lanzamiento de su sitio oficial, http://www.sharepointpros.org. Aún cuando el sitio está todavía en sus fases iniciales de desarrollo, los planes para el soporte multilenguaje y la funcionalidad existente que asistirá a todos los involucrados con SharePoint están en el horizonte.

Si tienes ideas para ISPA, te gustaría iniciar un grupo de usuarios o necesitas asistencia, visita el nuevo sitio de la ISPA o contacta a ISPA en contactus@sharepointpros.org. Juntos, la comunidad puede lograr lo que era imposible de forma individual – conviértete en parte de la ISPA hoy!”

 

Quisiera extender la invitación de Bob a todos quienes estén trabajando o estén interesados en las tecnologías SharePoint aquí en México, en particular a quienes participan ya de la Comunidad SharePoint de México y a los fabulosos Bloggers locales, para que se unan a esta iniciativa y me den a conocer las ideas sobre aquello en lo que les gustaría se convierta esta gran comunidad. Qué les gustaría ver en el sitio? Qué áreas de este gran producto SharePoint les interesa más? Qué clase de actividades de aprendizaje o intercambio de conocimientos les resulta más útiles?

Me encantaría recibir su feedback que me pueden enviar ya sea dejándome un comentario en este post, escribiéndome a mi link de contacto ó directamente a mi email.

Visiten por favor el sitio, donde podrán enterarse de quienes están formando parte ya de la ISPA, y estén atentos a las novedades que tendremos más adelante. Así mismo, aún hay algunos países de habla hispana que carecen de representación en la ISPA, no necesariamente por que no existan, sino porque simplemente no los conocemos. Si perteneces a alguno de ellos o conoces a sus líderes, por favor contáctate con nosotros y únanse!

Julio.

Tutoriales para aprender Excel Services

En estos días he estado evaluando la factibilidad de utilizar Excel Services, y en particular Excel Web Access, en mi proyecto actual. En mi búsqueda de información encontré una serie de tutoriales que me dieron todo el contexto general para implementar distintos escenarios posibles con Excel Services y, pues, me gustaría compartirlos.

Aquí los tutoriales con sus links de descarga:

Setting up the Server - Step 1: Creating a Trusted Location with Excel Services

Setting up the Server - Step 2: Configuring Single Sign-On for Excel Services

Setting up the Server - Step 3: Creating a Trusted Data Connection Library with Excel Services

Building a Report Based on Cube Functions for Excel Web Access

Protecting Workbook Intellectual Property (IP) with View Item Rights

Using OLAP Formulas, Conditional Formatting, and Charts

Building an OLAP PivotTable Report with Excel Services

Building a Relational PivotTable Report with Excel Services

Building a Report with a Chart for Excel Web Access Based on Cube Functions

Creating a Multi-Report Summary Page of Reseller Sales Data

 

Por acá algunas imágenes para que se den una idea de lo que se puede implementar con los tutoriales:

clip_image002

clip_image001

clip_image002[4]

clip_image002[6]

clip_image002[8]

 

Tal vez ya conocían sobre esto, porque Excel Services lleva rato en el mercado, pero yo soy nuevo en esto, así que a mis amigos novatos pues de seguro les será de utilidad. Por cierto, este otro link está también muy bueno para empezar.

Julio

Cómo compactar un disco duro virtual (pero bien compactado)

Quienes trabajen construyendo aplicaciones de servidor, especialmente aquellas basadas en SharePoint, saben lo que es trabajar a diario con máquinas virtuales y el dolor de cabeza que presentan aquellas máquinas cuando empiezan a crecer exponencialmente en tamaño. Esto sin duda causa que tan solo con unas cuantas máquinas virtuales pues te quedes sin espacio en disco rápidamente.

Lo interesante es que las máquinas virtuales crecen en función de la cantidad de archivos que se creen dentro de ella o que se le agreguen desde el exterior, pero nunca recuperan el espacio que queda libre luego de eliminar aquellos archivos que ya no son necesarios. Esto quiere decir que tu máquina virtual puede tener 30GB de tamaño, pero estar utilizando realmente no más de 15GB, teniendo otros 15GB de espacio desperdiciado. ¿Cómo recuperarlo?

Bueno pues, para quienes ya lo intentaron, no basta con usar el wizard de Virtual PC que compacta las máquinas virtuales. Tal como lo aprendí de este post de Guoqiang Wu son necesarios algunos otros pasos para asegurar recuperar el máximo espacio posible en la virtual y aquí describo brevemente dichos pasos.

1. Ejecuta un Disk Clean Up

Esto es por su puesto lo más obvio. Debes asegurarte de eliminar para siempre todos los archivos temporales y reciclados que anden por ahí en la virtual. Para esto, la forma más fácil es utilizando la utilidad Disk Clean Up de Windows que puedes acceder desde la ventana de propiedades del disco a limpiar.

DiskCleanup

2. Defragmenta el Disco (¡pero bien defragmentado!)

Esta es la parte más importante a mi parecer. Como probablemente sabes, tu disco se fragmenta día a día, haciendo que archivos que normalmente ocupan unos cuantos sectores de tu disco lleguen a ocupar cientos de ellos a traves de todo el disco, desperdiciando toneladas de bytes en el camino.

Podrías usar para esto el defragmentador de Windows, pero he comprobado que el defragmentador de Dave Whitney, que puedes descargar desde acá, hace un mejor trabajo al dejar los archivos mucho mejor ubicados continuamente en el disco. Una vez descargada la utilidad coloca los archivos tal como lo indica el Readme.txt que viene en la descarga y luego ejecuta esto desde tu línea de comandos:

defrag –i (esto instala el servicio del defragmentador)

defrag –d C: (esto inicia la defragmentación del disco C:)

Defrag

Esto tomará varios minutos, más que el defragmentador de Windows eso sí, pero lo que ganas vale la pena. Para darte una idea aquí te muestro una imagen del análisis que hace el defragmentador de Windows sobre mi disco luego de usar la utilidad de Dave:

Defragmented

Toma en cuenta que el tamaño de la máquina virtual crecerá bastante durante este proceso pero al compactar verás las ganancias.

3. Haz una Pre-Compactación del disco

Antes de proceder a compactar el disco es necesario encerar todos aquellos bytes que actualmente representan espacios vacíos. Es una forma de decirle a Virtual PC “hey, estos bytes ya no tienen nada útil, asegúrate de eliminarlos cuando compactes”.

Para hacer esto, dirígete al menú CD –> Capture ISO image… de Virtual PC y carga la imagen ISO del Virtual Disk Precompactor que encontrarás en tu directorio C:\Program Files\Microsoft Virtual PC\Virtual Machine Additions, de manera predeterminada. Luego simplemente sigue los pasos del wizard.

precompactor1

precompactor2

4. Compacta el disco

En este último paso apaga la máquina virtual y, desde la consola de Virtual PC, abre los Settings de la máquina, selecciona tu disco e inicia el asistente dándole click a Virtual Disk Wizard. Indícale que deseas editar un disco y luego selecciona Compact it.

wizard1

wizard2

Luego de unos minutos tu máquina se habrá compactado y todos los bytes vacíos habrán desaparecido, ganando mucho valioso espacio.

Una nota adicional: Asegúrate de tener suficiente espacio en tu disco real para realizar la compactación. Por ejemplo, si inicias con una máquina virtual de 10GB, esta crecerá posiblemente hasta 20GB durante el proceso y luego Virtual PC demandará otros 20GB para hacer la compactación. En este ejemplo entonces deberías tener unos 30GB libres antes de iniciar todo el proceso.

Espero sea de utilidad,

Julio

Cómo forzar la ejecución de jobs pendientes en SharePoint

Ayer estaba tratando de ejecutar el retract de una solución que tenía publicada en el portal SharePoint de un cliente, para luego hacer el deployment de una nueva versión de esta solución. El retract siempre se ejecuta como parte de un timer job. Sin embargo, este job nunca terminaba de ejecutarse, aún cuando ya llevaba casi 20 minutos esperando y la solución era realmente pequeña como para que demore tanto.

Afortunadamente me enteré de la operación execadmsvcjobs, parte del comando stsadm de SharePoint, la cual forza la ejecución de todos los jobs pendientes del servidor. Para ejecutarla simplemente colocas esto en la línea de comandos:

stsadm.exe –o execadmsvcjobs

execadmsvcjobs

Mi job se ejecutó con éxito, con lo cual el retract se completó y pude hacer el deployment de la nueva solución.

Espero sea de utilidad,

Julio

Cómo aumentar el tamaño máximo permitido para cargar archivos a SharePoint

Hace unos días tuvimos este problema de querer cargar un archivo de alrededor de 80MB a nuestro portal SharePoint. No justifico el hecho de querer subir un documento Word tan grande cuando en realidad lo podíamos haber reducido modificando el formato de las imágenes incrustadas (usaba puros bmps, cuando podían ser simples jpegs), o tal vez cambiando de .doc a .docx (que de hecho lo hicimos recientemente), pero en muchos casos sí puede ser necesario cargar un archivo así al portal. Luego de buscar un rato, nos topamos con la opción apropiada en el Central Administration de SharePoint, así que aquí les comento cómo se hace esto.

Para aumentar el tamaño máximo permitido para cargar archivos a SharePoint:

1. Dirígete al tab Application Management en tu Central Administration y selecciona Web application general settings en la sección SharePoint Web Application Management.

UploadSize1

2. En la página Web Application General Settings asegúrate de tener seleccionada tu aplicación Web en Web Application y luego, en Maximum upload size, ingresa el tamaño máximo que desees permitir para la carga de archivos al portal.

UploadSize2

Y listo. En mi ejemplo he subido el máximo permitido a 100MB.

Espero sea de utilidad,

Julio

Reunión de la Comunidad .NET en el Evento Software Guru 2008

Ayer pasamos un grato momento durante la reunión de la Comunidad .NET al finalizar el evento Software Guru 2008, uno de los más importantes de América Latina. Hubo alrededor de 25 personas en la sala, muy entusiastas por cierto y con muy buenas preguntas para ambas sesiones. Me encantaron las instalaciones de la sala que nos facilitaron, pues tenía todo: micrófono inalámbrico, otros dos micrófonos de mano, un podium muy cómodo, amplificadores de sonido, muy buena iluminación y proyección, y hasta servicio de cafetería! Estuvo excelente y me sentí afortunado porque no siempre se logra conseguir un lugar así.

SG3

SG6

SG10

Tuve la oportunidad de brindar la primera charla, en la que di una introducción a Silverlight. Allí presenté las características de esta tecnología, los escenarios en los que se aplica y cómo se integra con Visual Studio 2008 y Expression Blend 2.5. Presenté varias demos que demuestran su gran potencial y aplicabilidad. Espero les haya agradado.

SG1

SG2

SG4

SG5

Luego, José Raúl Guerrero, MVP de aquí de México, a quién tuve el placer de conocer durante el evento, presentó una charla muy interesante sobre SQL Server 2008, particularmente sobre los nuevos tipos de datos y nuevos queries que es posible generar gracias a las nuevas características de este poderoso motor de bases de datos. José Raúl tuvo muchas más preguntas que las que hubo durante mi sesión, así que vaya si estuvo buena la charla!

SG8

SG9

SG11

Fue muy agradable dar mi primera charla en el D.F. y desde ya recibí la invitación de José Raúl para brindar nuevas charlas en futuras reuniones de la comunidad. Ya tengo pensada la idea para la siguiente charla, así que ahí estaré!

Julio