BTS 2006: Integrando con SQL Server y Servicio Web.

Siguiendo con las capacidades de integración de Biztalk Server 2006 (BTS 2006) que estamos probando en el CIIN  en este post vamos a modelar un ciclo de gestión de pedidos de una organización. En concreto, en el escenario a modelar tenemos una aplicación de solicitud de pedidos que almacena los datos de los mismos en una BD SQL Server.  Estos datos de solicitud se envían  a un servicio web que se encarga de validar que el pedido puede ser servido comprobando si hay stock suficiente para ello. Una vez que el pedido es validado, el servicio web generará una factura que tiene que ser enviada en un cierto formato a él aplicativo de facturación.  Esta situación tan típica del “mundo real” es la que vamos a modelar e implementar de manera sencilla con BTS 2006 y las capacidades de integración comentadas.


Nuestro escenario de trabajo será el siguiente:


·         Recogemos los datos del pedido de una base de datos SQL Server.


·         Estos datos validamos y operamos con ellos mediante la invocación de un Servicio Web.


·         El servicio web nos devuelve unos datos de facturación que insertaremos en otra base de datos SQL Server.


Como hemos comentado, para realizar todos estos procesos utilizamos BTS 2006 y sus capacidades de integración. Así, nuestra primera tarea es poder extraer los datos de SQL Server utilizando puertos de BTS 2006.  Este proceso de integración con SQL Server lo explicó detalladamente mi compañero Juan Carlos en un post anterior (en este articulo solo detallaremos las diferencias de configuración pues la filosofía de trabajo es la misma). En nuestro caso la tabla de SQL de la que vamos a extraer los datos del pedido tiene la siguiente estructura:



Para extraer los datos, utilizamos un procedimiento almacenado  que es ejecutado desde un puerto de recepción de BTS 2006 (ya explicamos en el post citado las configuraciones necesarias para extraer y volcar datos desde / hacia una BD SQL Server).



Los datos que recogemos de la BD SQL Server tienen que ser enviados a un servicio web para validar que el pedido se puede servir. Por lo tanto, tenemos que modelar este proceso de negocio con las capacidades que nos da BTS 2006: recogida de los datos de SQL Server, envío de estos datos al servicio web de validación y en un cierto formato, y finalmente volcar los datos que nos devuelve el servicio web en una base de datos SQL Server para su explotación en la aplicación de facturación. Como hemos dicho,  este proceso de negocio lo modelaremos en BTS 2006 a través de Visual Studio 2005 y los artefactos necesarios: esquemas XSD, mapas de BizTalk en el que definir las transformaciones y el más importante, la orquestación que coordine la recogida de los datos del pedido de la base de datos, invoque al servicio web para que los valide, recoja de este la factura emitida y la entregue a la aplicación de facturación.



Por lo tanto nuestro siguiente paso será construir un proyecto de BizTalk utilizando Visual Studio 2005 e ir añadiendo los elementos mencionados.


Esquemas XSD


Una vez que tengamos creado el proyecto en el entorno de VS 2005, tenemos que insertar o crear los esquemas XSD que necesitamos para realizar los mapeos de datos necesarios en el proceso de negocio, y definir los mensajes que utiliza la orquestación:


·         Esquema correspondiente a los datos de solicitud del pedido, en este punto se nos plantea un problema, y es que necesitamos el esquema XSD correspondiente al archivo XML que nos generara BTS 2006 al extraer los datos del SQL Server, pero no disponemos directamente de ese esquema, aunque si podríamos obtener los mensajes XML que genera BTS 2006 en el proceso de extracción. Ante este problema una de las soluciones por las que podamos optar, es a hacer la aplicación escalable y obtener en primer caso el documento XML que genera BTS 2006, y una vez obtenido el documento XML utilizar una herramienta de Visual Studio 2005, que nos permite crear documentos XSD a partir de documentos XML bien formados.


Por lo tanto al puerto de recepción, que hemos configurado anteriormente, le añadimos un puerto de envío subscrito a él, de manera que todo mensaje que se entregue en el puerto de recepción sea recogido por el puerto de envío. Lo configuramos que se muestra en las siguientes figuras:


o   Configuración del puerto de envío, que a través del adaptador FILE volcará el archivo XML extraído en una carpeta.



o   Configuración de la suscripción del puerto de envío al puerto de recepción a través del correspondiente filtro.



De esta forma al iniciar la aplicación se nos creara un documento XML, con los datos insertados en la base de datos del SQL Server. Una vez creado este archivo en Visual Studio 2005 seleccionamos nuestro proyecto y escogemos la opción de añadir elemento- añadir elementos generados. Escogemos el grupo de esquemas y damos a añadir, se nos abrirá una ventana como esta.



En la opción de input file escogemos el archivo XML generado por BTS 2006 al extraer os datos del SQL Server y damos a OK, con lo que se generará el esquema XSD que cumplen los documentos XML que se extraigan de la BD SQL Server.



·         Esquema XSD de los datos que espera el servicio web, este esquema lo obtenemos directamente del servicio web, añadiendo la referencia web a nuestro proyecto de BTS 2006 igual que haríamos en otro proyecto de Visual Studio 2005.


·         Esquema XSD de los datos que devuelve el servicio web, ocurre lo mismo que en el caso anterior, al añadir la referencia web al proyecto de BTS 2006 tendremos acceso al esquema de vuelta con el que responde el servicio web después de realizar el procesado de los datos.


·         Esquema XSD de los datos que se van a volcar en la BD de facturación, aquí seguimos el mismo procedimiento que en el post de Juan Carlos, pero en nuestro caso utilizando un esquema con la siguiente estructura. Este esquema lo creamos de manera manual utilizando el editor que nos proporciona BTS 2006 (parte izquierda de la figura).



Mapas de BTS 2006


Nuestro siguiente paso será crear los mapas de BTS 2006 necesarios, cuya definición y propiedades podéis encontrar un post anterior mío.  Necesitamos dos:


·          El primer mapa permite pasar del mensaje XML con los datos del pedido al mensaje XML con los datos que espera el servicio web para comenzar a operar.


·         El segundo permite pasar del mensaje XML con los datos de facturación devuelto por el servicio web al mensaje XML que nos permitirá insertar los datos en la BD de facturación.


Cada mapa de BTS 2006 usa al menos 2 esquemas XSD, uno como origen y otro como destino. El primer mapa utiliza como origen el XSD correspondiente al documento XML con los datos que se extraen de la BD de pedidos, y como origen uno de los esquemas XSD que expone el servicio web para poder interactuar con él. En el segundo mapa, como origen utilizamos el esquema XSD de salida que expone el servicio web, y como destino el esquema XSD que cumplen los documentos XML con los datos de facturación. Para poder seleccionar los esquemas XSD que necesitamos en el mapa, utilizamos la herramienta BizTalk Type Picker que nos permite escoger los esquemas que tenemos en nuestra solución y los expuestos por cualquier referencia web que hayamos añadido.



Una vez que tenemos claro cuáles son los esquemas origen y destino para cada mapa, vamos a ver cómo serían dichos mapas:


·         Mapa1: Datos de Pedido – Entrada Servicio Web:



·         Mapa2: Salida Servicio Web – Datos de Facturación:



Orquestación


Nuestro siguiente paso es construir la orquestación que modela el proceso de de negocio. La orquestación tiene que ser capaz de recoger un mensaje XML con los datos procedentes del SQL Server, transformar esos datos para que el Servicio Web (WS) los entienda, comunicarse con el WS, recoger el mensaje procedente del WS con los datos validados, transformar esos datos para que se puedan insertar de nuevo en una tabla del SQL Server y finalmente mandar ese mensaje a un puerto físico para realizar la inserción en la tabla del SQL Server.


Para ello, tendremos que crear los mensajes con los que va a operar la orquestación para hacer efectivo el proceso de negocio. En este ejemplo necesitamos cuatro mensajes, uno de origen, otro de destino y después dos para comunicarse con el Servicio Web, el mensaje que se le manda al WS y el que recibe BTS 2006 del WS.



Estos mensajes con los que internamente trabaja la orquestación se van a corresponder con los documentos XML mencionados anteriormente a través de la configuración adecuada de sus propiedades. Para configurar cada mensaje simplemente  especificamos en la propiedad Message Type el esquema XSD o mensaje web (para el caso de utilizar referencias web) con el que se relaciona de manera unívoca:



Cuando tengamos configurado los mensajes,  utilizando el Diseñador de Orquestaciones empezaríamos a diseñar la orquestación, que tendría el siguiente aspecto.



Como vemos, la orquestación se compone de los siguientes elementos:


·         Port_Origen, puerto lógico de entrada por el que llegan los datos del pedido.


·         Recv_SQL, figura de tipo Receive que se enlaza con el puerto lógico de entrada y que es la que pasa los datos a la orquestación.


·         Transform_a_WS, figura de transformación que permite pasar de los datos originales del pedido a los datos que espera el servicio web. Esta figura es la que se encarga de hacer efectiva la transformación definida en el Mapa1.


·         Send_WS, figura de envío que se encarga de enviar los datos que espera el servicio web.


·         WS_Port, que es un puerto lógico bidireccional capaz de recibir y enviar datos. Este puerto recoge los datos destinados al servicio web, y envía los datos que este devuelve.


·         Transform_a_SQL, que es otra figura de transformación que se encarga de pasar de los datos enviados por el servicio web a los datos que espera la aplicación de facturación. Para ello, utiliza el Mapa2.


·         Snd_Destino, que es un puerto lógico de envío que se encarga de enviar los datos a la base de datos de facturación.


Nota: Aunque se hable de datos, en todo momento tenemos que tener presente que seestá trabajando con documentos XML entre los distintos elementos de la orquestación.


Configuración de los puertos lógicos y deploy de la solución


Finalmente solo nos falta de configurar los puertos lógicos de la orquestación, el puerto de recepción y el puerto de envió finales son muy sencillos de configurar y prácticamente solo es seguir el wizard que se nos abre cuando pinchamos en la admiración del send shape y receive shape. Sin embargo el puerto bidireccional que utilizamos para comunicarnos con el servicio web es algo más complicado de configurar, por lo que merece la pena que nos paremos a ver como es esta configuración.


Nos colocamos en una de zonas de puertos (Port Surface) y damos botón derecho, seleccionamos New Configured Port. Damos a siguiente y le ponemos un nombre, en nuestro caso le hemos llamado WS_port. El siguiente paso le configuramos como se muestra en la siguiente imagen.



Como podéis ver en la imagen anterior seleccionamos la opción Use an existing Port Type y escogemos Web Port Types. En ese punto no vendrá el tipo de puerto que está unido a nuestra referencia web.


Con esto ya tendremos configurada completamente nuestra orquestación, por lo tanto solo tenemos que construir y desplegar nuestro proyecto. Una vez hecho esto solo tendremos que realizar los ajustes en la consola de administración para tener nuestra aplicación configurada.


Juntándolo todo


Para realizar la inserción de los datos en la base de datos de facturación seguimos en el mismo procedimiento que explicamos en un post anterior. Además de configurar el volcado de datos, también debemos de configurar el puerto de envío físico para comunicarse con el Servicio Web. Este puerto será diferente a los que hemos utilizado, ya que no será solo de envío o solo de recepción, sino que debe de poder enviar y recibir de datos del Servicio Web. Para crearle vamos al nodo de Send Ports de nuestra aplicación, damos botón derecho y escogemos Static Solicit-Response Send Port.



Una vez creado tenemos que configurarle. Escogemos tipo de transporte SOAP, y en su configuración introducimos la url del Servicio Web con el que nos vamos a configurar, tal y como se muestra en la siguiente figura.



Por lo tanto solo nos falta configurar las propiedades de la orquestación. Para ello nos vamos a configurar su binding, en este caso tendremos 2 puertos de envío y un puerto de recepción, configuramos los binding como se muestra en la figura siguiente.



Para terminar, iniciamos la aplicación desplegada y configurada y si todo ha ido bien en la BD de facturación deberían aparecer los datos de la factura correspondiente al pedido realizado:



Los datos corresponden con el campo ID_Pedido de la primera tabla al que se le ha concatenado el string “FACT” y el valor importe se calcula multiplicando el campo Cantidad por una constante definida en Servicio Web. Con esto concluye este post sobre integración y capacidades de BizTalk Server 2006, espero que os sea de utilidad y un saludo a todos.


Anuar

BizTalk Server 2006 R2: Novedades!

Ayer asistí a un WebCast de Microsoft TechNet en el que Tomás Hernández nos contaba algunas de las novedades más importantes que vendrán con la R2 de BizTalk Server 2006 (BTS  2006 R2). Esta nueva release de BTS 2006 se espera que aparezca en septiembre de este año, y actualmente se encuentra en Beta 2, disponible para los partners y empresas que han entrado en el programa TAP (Technology Adoption Program) de Microsoft. Como veremos, algunas de las mejoras más relevantes están enfocadas hacia un mejor soporte de EDI por parte de BTS 2006, soporte de RFID, y por supuesto nuevos adaptadores basados en .NET Framework 3.0.


Si queréis acceder al webcast grabado, aquí os dejo el enlace. Veréis que hay otros enlaces relativos a BTS 2006.


¿Qué es BTS 2006 R2?


Como su nombre indica, es la nueva versión de BTS 2006 que amplía las funcionalidades de su predecesor:



·         Amplia notablemente las funcionalidades de su predecesor, a través de un mejor soporte para problemáticas específicas (EDI, RFID) y potenciando aún más sus capacidades de integración (WCF está plenamente soportado e integrado).


·         Mejora la gestión de los procesos de negocio (Business Process Management, BPM).


·         Mejor soporte EDI: Se mejora el adaptador EDI y se soportan más esquemas.


·         Soporte para RFID.


·         Soporte de WCF y WF.


·         Nuevo framework de adaptadores para construir adaptadores sobre la base de WCF.


Mejor Soporte EDI


BTS 2006 R2 mejorará notablemente el soporte de EDI de su predecesor:


·         Se soportan más esquemas de EDI, tanto de los estándares EDIFACT y X12 ya soportados, como el soporte de nuevos estándares: HIPAA (Sector Sanitario) y EANCOM (Sector Comercio).  En total, se soportarán más de 7000 esquemas EDI.


 
























































































































































Segmento


Estándar


Versión


Número de Esquemas Incluidos


Industria en General


EDIFACT


D93A


55


D94A


68


D94B


75


D95A


101


D95B


115


D96A


125


D96B


136


D97A


143


D97B


151


D98A


157


D98B


165


D99A


169


D99B


180


D00A


187


D00B


191


D01A


194


D01B


194


D02A


194


D02B


194


D03A


192


D03B


192


D04A


192


D04B


192


D05A


193


D05B


193


X12


2040


29


3010


39


3020


104


3030


161


3040


187


3050


225


3060


245


3070


273


4010


293


4020


302


4030


309


4040


314


4050


314


5010


318


5020


317


5030


317


Retail


EANCOM


EAN94


27


EAN97


46


EAN02


46


Sanidad


HIPAA X12N


401A1


16


 


·         Soporte de batching / debatching, es decir, poder gestionar mensajes EDI que tengan varias transacciones.


·         Nueva pipelines para integrar (envío / recepción) de manera nativa documentos EDI en BTS 2006. Esta pipeline se encarga de realizar el desensamblado de la de la información, parsing necesario y validación:


o   Dividir el mensaje en sus componentes.


o   Generar el XML de intercambio.



·         Mejor gestión de errores:


o   Información detallada de los errores producidos al procesar / generar EDI.


o   Soporte y  generación de asentimientos.


o   Detectar duplicados EDI y suspenderlos.


·         Se mejora la configuración de EDI, y como muestra este pantallazo del blog del equipo de B2B de Microsoft:



·         Posibilidad de extender los esquemas soportados en tiempo de diseño, lo que es muy útil a la hora de poder incluir nuevos valores en aquellos campos que almacenen codificaciones (Por ejemplo, para EDIFACT el Código de Identificador de Parte).



·         Y otras mejoras que podéis encontrar en el blog del equipo de B2B de BTS 2006. De hecho, todas las mejoras aparecen en este post.


Además de los puntos anteriores, un añadido de BTS 2006 R2 es que incluye soporte para el estándar AS2.


Soporte RFID


Una de las grandes novedades de BTS 2006 es el soporte de RFID que, como se comenta en este artículo, proporciona una infraestructura unificada para descubrir, comunicar y gestionar dispositivos RFID en plataforma Windows. Incluye los bloques necesarios para poder integrar estos dispositivos con aplicaciones existentes:


·         Identificación por radiofrecuencia.


·         Modelo de procesado de eventos RFID: almacenar, administrar y gestionar este tipo de eventos.


·         Se pueden aplicar conceptos y herramientas ya existentes en BTS 2006: reglas, alertas, transformaciones, etc.


·         Integración de la información RFID con WF y Data Warehouse.


·         Desarrollo en entorno desconectado: puedo crear la lógica de gestión de los dispositivos RFID sin tener que conectarlos a mi plataforma de desarrollo. De este modo, nos centramos en la capa lógica.


La arquitectura del soporte RFID en BTS 2006 R2 es la siguiente:



Los elementos más importantes de la arquitectura RFID son:


·         La capa DSPI (Device Service Provider Interface), que abstrae a la infraestructura RFID de BTS 2006 de todo lo que se coloque por debajo: dispositivos con tecnología RFID actual, sensores, futuros dispositivos, etc. Esta capa estará formada por un conjunto de API’s que permitirán que cualquier dispositivo RFID pueda interactuar con BTS 2006.


·         Como siempre, un motor de ejecución que se encarga de tratar y utilizar los datos enviados por los dispositivos RFID en los procesos de negocio de la organización. El motor se encargará de eliminar el ruido que pueda existir, filtrar, agregar y transformar datos RFID dentro de estos procesos de negocio. El motor de ejecución se compone de:


o   El motor de procesamiento de eventos que realiza la captura efectiva de los datos RFID.


o   El gestor de dispositivos, que se encarga de gestionar todos los dispositivos en el entorno de ejecución.


·         La infraestructura RFID de Microsoft, que da acceso al modelo de objetos y a las API’s que permiten diseñar, implementar, desplegar y gestionar soluciones RFID.


·         Un conjunto de diseñadores, herramientas y adaptadores que permitan crear distintos procesos de negocio en los que se requiera interacción con dispositivos RFID.


Soporte WCF


BTS 2006 R2 traerá un conjunto de adaptadores WCF que permitirán consumir y exponer servicios de este tipo en soluciones de BTS 2006. Hasta ahora, podíamos consumir servicios web a nivel de puerto y orquestación a través del SOAP Adapter, y exponer orquestaciones como servicios web. Con estos nuevos adaptadores, se podrán consumir servicios WCF a nivel de puerto y orquestación, así como exponer orquestaciones de BTS como servicios WCF.



Los nuevos adaptadores de WCF incluidos son:


·         WCF-WSHttp, que soporta WS-* sobre protocolo HTTP.


·         WCF-NetTcp, que soporta WS-* sobre TCP.


·         WCF-NetMsmq, que da soporte para transporte MSMQ.


·         WCF-BasicHttp, que habilita la compatibilidad con los servicios web tradicionales.


·         WCF-NetNamedPipe, que habilita la comunicación utilizando transporte NamedPipes.


·         WCF-Custom, que permite utilizar componentes WCF personalizados. Proporciona la infraestructura para crear nuestros propios adaptadores WCF personalizando binding y behaviors.


·         WCF-CustomIsolated, que habilita conectividad HTTP  fuera de los límites del IIS.


Además, las nuevas capacidades WCF de BTS 2006 R2 habilitan el uso de cabeceras WS-* en el enrutado de mensajes.


 .NET  3.0 Adapter Framework


Como su nombre indica, esta novedad de BTS 2006 R2 nos dará la infraestructura (API’s) necesaria para construir fácilmente nuestros adaptadores utilizando como base .NET Framework 3.0 (y en particular WCF) y poder simplificar la integración con sistemas LOB (SAP, Siebel,…), bases de datos (SQL Server, Oracle,…), colas de mensajería (MSMQ), etc.



La definición inicial de estos adaptadores se basará en el uso de asistentes que crearán la estructura inicial del adaptador que luego será extendida.



Este nuevo framework provee un conjunto de clases que facilitan la implementación de estos nuevos adaptadores  y que serán expuestos a terceros como canales de WCF.


BAM – WF y WCF


La BAM (Business Activity Monitoring, de la que espero hacer un post en el futuro) es el componente de BTS 2006 pensada para la gestión de BPM en dicha plataforma. En este sentido, proporciona las capacidades necesarias para definir y desplegar vistas de negocio sobre los procesos de negocio modelados con BTS 2006.  Para ello, es necesario vincular los procesos de negocio con estas vistas de negocio a través del uso de interceptores. Es en este punto dónde la R2 introducirá cambios en la BAM, puesto que incluirá interceptores para WF y WCF, de manera que además de los procesos de negocio modelados con la BAM podremos definir vistas de negocio sobre aquellos procesos modelados con WF y WCF.



Y hasta aquí lo que de momento se sabe sobre las novedades que vendrán con BTS 2006 R2, que son muchas y muy interesantes. Espero que el post os haya resultado interesante.

Integración de Reporting Services con SharePoint (II)

En el post anterior ya explicamos los pasos que hay que seguir para integrar SQL Server Reporting Services con SharePoint (WSS ó MOSS), ahora vamos a ver cómo podemos utilizar esta integración para poder crear y ver estos informes desde nuestro sitios SharePoint. Para ello vamos a utilizar las herramientas que nos ha añadido los add-in de Reporting Services, que son:




  • Content Type:


    • Report Data Source
    • Report Builder Model
    • Report Builder Report    

  • SQL Server Reporting Services Report Viewer Web Part

Lo primero que debemos realizar para generar los informes es la conexión a la base de datos y la definición del modelo de datos que vamos a utilizar, este proceso se puede desarrollar también desde Visual Studio creando un nuevo proyecto de tipo Report Model Project y después conectándolo con el servidor de SharePoint, pero nosotros lo vamos a diseñar desde el propio servidor realizando los siguientes pasos:



  • Nos creamos una librería de documentos en la que vamos a activar el uso de Content Type y vamos a añadir los Content Type de Report Data Source y Report Builder Model, para realizar la conexión a la base de datos y el modelo de datos a utilizar en los informes.
  • Una vez creada, pulsamos sobre la opción Report Data Source que nos aparece en el menú New de la librería de documentos y especificamos los parámetros de la conexión a la base de datos, que son establecer un nombre al fichero .rsds, poner el tipo del origen de datos, la cadena de conexión y las credenciales que utiliza el servidor de reporting para acceder al origen de datos.



  • Una vez que ya tenemos definido el fichero de acceso a la base de datos, vamos a crear el modelo de datos para utilizarlo en la generación de informes, para ello pulsamos sobre la opción Report Builder Model y nos abrirá la pantalla donde especificaremos el nombre del fichero .smdl que vamos a crear del modelo de datos y seleccionamos el fichero de la cadena de conexión a la base de datos definido anteriormente



  • Cuando haya terminado de generar el modelo de datos para los informes, podremos en sus propiedades modificar sus parámetros como la cadena de conexión, la seguridad, regenerar el fichero o realizar los informes directamente pulsando sobre Load in Report Builder


Una vez que ya tenemos definidos los ficheros de la conexión a la base de datos y del modelo de datos que vamos a utilizar, tenemos dos caminos para generar los informes:



  1. Desde el propio modelo de datos generado pulsando sobre la opción de sus propiedades Load in Report Builder.
  2. Desde una librería de documentos activando el Content Type de Report Builder Report

Al ejecutar cualquiera de estas dos opciones, lo que nos van a arrancar una aplicación Click-one que va a instalar y ejecutar el programa de Sql Server 2005 Reporting Services Report Builder para poder definir nuestros informes




Nota: Si lo ejecutamos desde la librería de documentos, al arrancar la aplicación debemos seleccionar el modelo de datos a utilizar en el informe.



Una vez tengamos el programa arrancado y el modelo de datos seleccionado, podremos ver todas las tablas con las que podemos trabajar y generar el informe, y tan solo arrastrando los campos a la plantilla, diseñando los filtros, parámetros, etc…. vamos diseñando el informe, y si pulsamos sobre la opción Run Report podemos ir viendo una vista previa del mismo.



Una vez que hayamos terminado de definir el informe y de guardarlo en la librería de documentos establecida para ello, podremos ver el informe desde SharePoint de dos formas diferentes, una pulsando directamente sobre el propio fichero generado que nos abrirá una nueva ventana del navegador con el informe, o añadiendo a la página principal la web part de SQL Server Reporting Services Report Viewer y seleccionando el informe que queramos visualizar.


LINQ To XML: Integración de XML!

Como no podía ser de otra forma, y después de hablar de las bases de LINQ y de LINQ To SQL, desde el CIIN nos faltaba comentar la “tercera pata” del proyecto LINQ: LINQ To XML. Lo de tercera pata va entrecomillado, porque ya tenemos a la vista nuevas capacidades (como LINQ To XSD) y nuevas siglas  que integran las siglas LINQ (CLINQ, para habilitar el uso de parte de las características de LINQ en C++/CLI, PLINQ, para definir una implementación de LINQ que permita la ejecución de código LINQ en múltiples CPU’s,  y seguro que algún componente más de LINQ sobre el que alguien ya está trabajando) y de las que espero poder comentaros cosas interesantes próximamente (especialmente de BLINQ).  Empecemos pues con LINQ To XML.


¿Qué es LINQ To XML?


Según la documentación oficial sobre LINQ, LINQ To XML es el componente específico de LINQ pensado para trabajar con información en formato XML cacheada en memoria, aprovechando las ventajas de los operadores estándar de consulta, y que además expone y añade nuevas funcionalidades para crear y manipular (a través de la integración en .NET Framework de toda la potencia que dan las transformaciones XPath y XQuery) de manera sencilla tanto documentos XML completos como porciones o fragmentos de una estructura XML. Por supuesto, como sucedía con LINQ To SQL, LINQ To XML va a permitir combinar consultas y transformaciones de documentos o fragmentos XML con consultas de otros orígenes de datos (relacionales o no). Estas prestaciones de LINQ To XML se apoyan en las siguientes características clave:


·         Las innovaciones del lenguaje (C# 3.0 y VB 9.0) que vimos en un post previo, así como en las características propias de LINQ (consultas integradas en el lenguaje).


·         Consultas a estructuras XML integradas en el lenguaje, es decir, tenemos la potencia de XPath y XQuery dentro de C# y VB.


·         Se sigue manteniendo la experiencia de DOM, pero se utiliza de un modo más sencillo:


o   Visión centrada en los elementos particulares de una estructura XML, frente a la visión anterior centrada en el documento.


o   Construcción funcional y a medida de estructuras XML. No necesito construir un documento XML completo, y puedo trabajar directamente con elementos XML al estilo XPath.


·         Las estructuras XML se crean de un modo dinámico, lo que simplifica su tratamiento.


·         Supone una representación en memoria más eficiente, que se integra con la infraestructura de lectura/escritura de System.Xml.


·         Se pueden cargar documentos XML existentes desde múltiples orígenes: XmlReader, TextReder, o  un simple String.


Siguiendo la misma referencia de otros post,  en la traducción de El Proyecto LINQ de Octavio Hernández, LINQ To XML define tres tipos de objetos en los que se basa la mayor parte de la integración de consulta contra estructuras XML.


·         XName, que habilita los mecanismos para trabajar de manera sencilla con los identificadores de espacios de nombres (QNames) utilizados en los nombres de elementos y atributos.


·         XElement, que viene a representar un elemento o nodo de una estructura / documento XML.


·         XAttribute, que es la representación de un atributo de un elemento.


Aunque estos tres tipos son las piezas claves de LINQ To XML, hay muchas más clases definidas en su jerarquía de clases (hasta la Preview de Mayo de 2006).



Después de esta introducción a lo que es LINQ To XML, en los siguientes apartados trataré de cubrir aspectos relativos a la construcción de estructuras XML, la integración con datos precedentes de fuentes no XML, y operaciones de manipulación y transformación de estructuras XML con LINQ To XML. Empecemos.


Nota: Los requisitos necesarios para probar LINQ To SQL son los que ya comentamos en el primer post de LINQ.


Creación y consulta de información en estructuras XML


Lo primero que vamos a ver es como de un modo sencillo podemos crear un sencillo documento XML (utilizando lo que LINQ To XML denomina Construcción Funcional, que permite crear un estructura XML, completa o no, en una única sentencia), y como también es realmente sencillo definir una consulta sobre dicha estructura (que no deja de ser un objeto en memoria fácilmente consultable con LINQ). El código necesario para crear el documento XML es el siguiente:







           XDocument DocXML= new XDocument(


                    new XDeclaration(“1.0″,”utf-8″,”yes”),


                    new XComment(“Ejemplo de doc. generado con LINQ To XML”),


                            new XElement(“Agenda”,


                                new XElement(“Contactos”,


                                    new XElement(“Contacto”,new XAttribute(“Categoría”,”Particular”),


                                    new XElement(“Nombre”,”José González”)),


                                    new XElement(“Contacto”,new XAttribute(“Categoría”,”Particular”),


                                    new XElement(“Nombre”,”María Méndez”)),


                                    new XElement(“Contacto”,new XAttribute(“Categoría”,”Trabajo”),


                                    new XElement(“Nombre”,”Antonio Muñoz”)))));


            Console.WriteLine(DocXML);


Con el código anterior, estamos creando un documento XML a partir de instanciar el objeto XDocument a través de una de las cuatro sobrecargas que tiene definidas. En concreto, la sobrecarga utilizada permite especificar mediante XDeclaration los valores utilizados para la versión, codificación y si el documento es standalone, y luego una lista de parámetros con los elementos que forman parte del documento XML y que en este caso son unos comentarios (especificados a través de XComment) y una jerarquía de elementos XML especificados mediante XElement. Finalmente, para visualizar por pantalla el documento vemos que no se necesita ningún tipo de factoría DOM, sino que es directamente visualizable sin hacer ningún tratamiento previo (lo que es una gran ventaja, ya que estamos creando un documento XML de un modo realmente sencillo con LINQ To XML). La salida por pantalla es la siguiente:



Al esquema anterior le podemos añadir de manera sencilla un nombre XML utilizando el objeto XNameSpace, que encapsula un espacio de nombres XML. Además, este documento no solo lo podemos visualizar de manera sencilla, sino que también guardarlo en disco realmente fácil utilizando el método Save() del objeto XDocument.







            XNamespace miEspacioNombres=”http://www.ciin.es/esquemas”;


            XDocument DocXML= new XDocument(


                    new XDeclaration(“1.0″,”utf-8″,”yes”),


                    new XComment(“Ejemplo de doc. generado con LINQ To XML”),


                            new XElement(miEspacioNombres + “Agenda”,


                                new XElement(miEspacioNombres + “Contactos”,


                                    new XElement(miEspacioNombres + “Contacto”,


                                        new XAttribute(“Categoría”,”Particular”),


                                    new XElement(miEspacioNombres + “Nombre”,”José González”)),


                                    new XElement(miEspacioNombres + “Contacto”,


                                         new XAttribute(“Categoría”,”Particular”),


                                    new XElement(miEspacioNombres + “Nombre”,”María Méndez”)),


                                    new XElement(miEspacioNombres + “Contacto”,


                                        new XAttribute(“Categoría”,”Trabajo”),


                                    new XElement(miEspacioNombres + “Nombre”,”Antonio Muñoz”)))));


 


            Console.WriteLine(DocXML.ToString());


            DocXML.Save(“Contactos.xml”);


 En este caso, el documento XML guardado en disco tendría este aspecto:



Nota: Igual que con el método Save() podemos guardar una estructura XML en disco, el método Load() de XDocument nos permite cargar un documento que está guardado en disco y manipularlo del mismo modo en que estamos trabajando con estructuras XML creadas en memoria.


Definir consultas sobre un documento XML como el anterior es bastante sencillo a través del uso de los operadores estándar de consulta. A modo de ejemplo, el siguiente código nos permite obtener todos los contactos de tipo Particular en el documento XML creado anteriormente:







         Console.WriteLine(“****Definiendo una consulta contra una estructura XML****”);


            var ContactosParticulares=


                from c in DocXML.Descendants(miEspacioNombres + “Contacto”)


                where (string)c.Attribute(“Categoría”)==”Particular”


                orderby (string)c.Element(miEspacioNombres + “Nombre”)


                select c;


            //Hacemos efectiva la consulta


            foreach (var contacto in ContactosParticulares)


            {


                Console.WriteLine(“{0}”,contacto);               


            }


 Del código anterior, hay que destacar un par de cosas:


·         EL método Descendant que nos permite obtener todos los elementos descendientes del tipo especificado (en este caso Contacto).


·         El hecho que tanto en la condición de la cláusula where como en la de la cláusula orderby estamos indicado que de manera específica se trabaja con elementos del documento XML de tipo cadena. Y la razón de este modo de trabajo hay que buscarla en el hecho de que LINQ To XML permite tratar los valores contenidos en elementos y atributos respetando sus tipos sin más que hacer un simple cast (aquí tenemos otra ventaja de LINTO To XML, frente al W3C DOM que siempre trata los nodos XML como textos).


La correspondiente salida por pantalla es la siguiente:



En esta salida vemos como efectivamente LINQ To XML no obliga a trabajar a nivel de documento XML completo, sino que podemos quedarnos a nivel de elementos XML.


Integración con datos no XML


Hasta ahora hemos visto como es bastante sencillo construir estructuras XML utilizando la Construcción Funcional de LINQ To XML. Sin embargo, las estructuras que hemos construido se basan en ir añadiendo de manera estática elementos  de tipo string al árbol. Como comentamos, se podrían añadir otros tipos de datos, y por supuesto, podemos utilizar variables en la construcción en lugar de valores. Pero, ¿Cómo hacemos más dinámica esta construcción funcional? La respuesta está de nuevo en utilizar el tipo IEnumerable<T> aplicada a objetos de tipo XElement, lo que nos permitirá construir estructuras XML a partir de objetos de memoria, resultados procedentes de hacer una consulta a una BD, etc. Para explicar este tipo de construcción, vamos a ver cómo podemos crear una estructura XML a partir de definir una consulta sobre un array de objetos de un cierto tipo:


·         Lo primero es definir la clase a partir de la cuál crearemos los objetos contenidos en el array.


 







        class Contacto


        {        


            public string Nombre;


            public string Telefono;          


        }


 


·         Lo siguiente que haremos es construir el arreglo de objetos aprovechándonos de algunas de las innovaciones en el lenguaje que ya vimos (en concreto, declaración implícita de tipos, tipos  anónimos e inicializadores de objetos):


 







            var contactos_agenda=new[]{


                new Contacto{Nombre=”José González”,Telefono=”11111″},


                new Contacto{Nombre=”Luis García”, Telefono=”22222″},


              


            };


  


·         Sin más, ya podemos construir una estructura XML (en este caso no vamos a construir un documento completo, sino sólo una serie de elementos XML) a partir de definir una consulta XML sobre el array de objetos creado:







            XElement Contactos=


                new XElement(miEspacioNombres + “Contactos”,


                    from c in contactos_agenda


                    select new XElement(miEspacioNombres + “Contacto”,


                        new XElement(miEspacioNombres + “Nombre”,c.Nombre),


                        new XElement(miEspacioNombres + “Telefono”,c.Telefono)));


            Console.WriteLine(Contactos.ToString());


 La clave del código anterior está en que dentro de la cláusula Select podemos construir objetos de tipo XElement, y en que los objetos de tipo XElement pueden ser construidos a partir del resultado de una consulta a un objeto de memoria. La salida por pantalla generada es la siguiente:



Igual que hemos construido una estructura XML a partir de definir una consulta contra un objeto de memoria, se aplicaría la misma filosofía y método para generar estructuras / documentos XML a partir de datos de una BD relacional y apoyándonos en LINQ To SQL como ya vimos.


Operación y manipulación de estructuras XML


Como comentábamos, otra característica relevante de LINQ To XML es que permite realizar de un modo sencillo operaciones con estructura XML. Vamos a ver algunas de ellas:


·         Operaciones de Transformación, que nos permiten transformar y extender estructuras XML ya definidas. A partir de los elementos de una estructura XML existente, es posible crear nuevos elementos:


 







Console.WriteLine(“***********Operaciones de Transformación***********”);          


 XElement ElementoTransformado =


                new XElement (miEspacioNombres +  “Amigos”,


                    from c in ContactosParticulares


                    select new XElement(miEspacioNombres + “Amigo”,


                                new XAttribute(“NombreCompleto”,(string)c.Element(miEspacioNombres +  


                                                         “Nombre”))));


            Console.WriteLine(“nn {0}”,ElementoTransformado);


 


Lo que hemos hecho en el código anterior de la consulta de los contactos particulares del documento original XML para generar una estructura XML distinta, pero aprovechando datos de la consulta. La salida por pantalla obtenida es la siguiente:



 


·         Añadir, eliminar y actualizar elementos, LINQ To XML permite añadir, eliminar o modificar contenidos en una estructura XML a partir de los métodos Add(), Remove() y ReplaceContent() del objeto XElement. Así, para modificar la estructura anterior el código necesario sería:







            Console.WriteLine(“***********Añadir, Borrar, Modificar elementos**********”);


            XElement Telefono=new XElement(miEspacioNombres  + “Telefono”,”111111″);


            ElementoTransformado.Element(miEspacioNombres + “Amigo”).Add(Telefono);


            Console.WriteLine(“n Añadir”);


            Console.WriteLine(“n {0}”,ElementoTransformado);


           


            Console.WriteLine(“n Modificar”);


            ElementoTransformado.Element(miEspacioNombres  +


                               “Amigo”).Element(miEspacioNombres  +


                              “Telefono”).ReplaceContent(“22222”);


            Console.WriteLine(“n {0}”,ElementoTransformado);


 


            Console.WriteLine(“Borrar”);


            ElementoTransformado.Element(miEspacioNombres  +


                             “Amigo”).Element(miEspacioNombres  + “Telefono”).Remove();


            Console.WriteLine(“n {0}”,ElementoTransformado);


 Y la salida por pantalla correspondiente es la siguiente:



·         Navegar por los nodos de una estructura XML, LINQ To XML habilita varios mecanismos para navegar por los nodos de una estructura XML a través de los métodos Nodes() y Descendant() del objeto XElement. Estos métodos nos facilitan la tarea de poder trabajar con elementos concretos de nuestra estructura XML. Un ejemplo de uso de ambos es el siguiente:







            Console.WriteLine(“****Navegando por los nodos de un elemento XML****”);


            Console.WriteLine(“n Con Descendants()”);


            foreach(var x in ElementoTransformado.Descendants(miEspacioNombres +  “Amigo”)){


                Console.WriteLine(x);


            }


 


            Console.WriteLine(“n Con Nodes()”);


           foreach(var x in ElementoTransformado.Nodes()){


                Console.WriteLine(x);


            }


 La salida por pantalla que se obtiene es la siguiente:



Como vemos, la salida que producen ambos métodos es la misma para el caso de una estructura XML sencilla. Para estructuras más complicadas, el resultado será distinto puesto que Descendants() siempre nos devolverá todos los elementos por debajo de  un elemento especificado, mientras que Nodes() siempre nos va a devolver los nodos por debajo del primer elemento en la jerarquía de la estructura XML en cuestión.


Nota: En el caso de trabajar con atributos, sólo es posible realizar operaciones de borrado de los mismos a través de los método Remove() o SetAttribute() del objeto XAttribute.


Finalmente,  y para concluir el post os dejo una recopilación de las extensiones específicas de LINQ To XML que proporcionan la capacidad para realizar ciertas operaciones que tienen sentido al trabajar con estructuras XML (algunas de ellas las hemos visto en las operaciones de manipulación y transformación de estructuras XML).























Operadores


Descripción


Elements()


Devuelve todos los elementos hijos para cada XElement de una secuencia de XElements (IEnumerable <XElement>).


Descendants() y Ancestors()


Nos permiten consultar respectivamente los elementos situados por encima y por debajo (en la jerarquía) del elemento especificado (sin incluirlo).


Attributes()


Es una extensión llamada en IEnumerable<XElement> que devuelve una secuencia de atributos (IEnumerable<Attributes>).


ElementsBeforeThis, ElementsAftherThis


Permiten devolver todos los elementos hijos o contenidos que aparecen, respectivamente, antes y después de un elemento particular. En ambos casos devuelven un tipo IEnumerable<XElement>.


NodesBeforeThis, NodesAfterThis


Se comportan igual que ElementsBeforeThis y ElementsAfterThis, salvo que en este caso se devuelve un tipo IEnumerabe<XNode>.



Y hasta aquí lo que os quería contar de LINQ To XML. En la próxima me gustaría comentaros otras iniciativas que están surgiendo en torno a LINQ, y enseñaros con ejemplos de que va BLINQ. Espero que el post os haya resultado de interés. Como en el post anterior, os dejo aquí el zip con la solución del proyecto de LINQ To XML.

Integración de Reporting Services con SharePoint (I)


En este post vamos a explicar los pasos a seguir para la instalación y el uso de Microsoft SQL Server 2005 Reporting Services en sitios SharePoint, ya sean WSS 3.0 o MOSS. Esta configuración la conseguimos gracias a que Microsoft ha publicado recientemente la versión definitiva del Service Pack 2 de SQL Server que entre una de sus muchas novedades, habilita dentro de la configuración del Reporting Services una nueva opción para poderlo integrar con sitios SharePoint y a los también publicados Add-in de SQL Server 2005 Reporting Services para SharePoint, que nos incluyen:




  • Dos Web Part, Report Explorer y Report Viewer que nos permiten visualizar informes, exportarlos con otros formatos, imprimir y realizar zoom
  • Tres content types, Report Builder Model, Report Builder Report y Report Data Source con las que podemos diseñarnos informes desde el propio SharePoint conociendo el origen de los datos
  • Nuevas opciones en la administración central de SharePoint para administrar el acceso y la seguridad al servidor de Reporting Services

Antes de empezar a configurar el servidor de Reporting Services y el de SharePoint, tenemos que estar seguro de que nuestro escenario tengamos instalados todos estos componentes:




  • SQL Server 2005 Reporting Services
  • SQL Server 2005 Service Pack 2
  • Office SharePoint Server 2007 ó Windows SharePoint Services 3.0
  • Microsoft SQL Server 2005 Reporting Services Add-in for Microsoft SharePoint Technologies

Configuración del servidor de Reporting Services


Lo primero que vamos a realizar es la configuración del servidor de Reporting Services para poderlo integrar con sitios SharePoint. Para ello vamos a realizar los siguientes pasos:




  • Configurar los parámetros del IIS para definir un sitio web en el que alojar los Reporting Services

    • Accedemos a la administración del IIS
    • Normalmente, veremos que el Default Web Site está parado, ya que SharePoint utiliza el puerto 80 en un sitio web diferente y deshabilita este sitio, por eso vamos modificarle especificando un puerto diferente, ej. 8080, y después lo habilitamos para que así esté disponible en la configuración de Reporting Services




  • Vamos a la pantalla de administración de Reporting Services pulsando sobre Start à All Programs à Microsoft SQL 2005 à Configuration Tools à Reporting Services Configurations
  • El primer paso que realizamos para la configuración es entrar en la opción de Report Server Virtual Directory y crear un nuevo directorio virtual en nuestro sitio web, seleccionando el Default Web Site y estableciendo un nombre del directorio virtual, por defecto ReportServer

 



  • Después pulsamos sobre la opción Database Setup para crear una nueva base de datos de Reporting Services y la vinculamos con nuestro sitio SharePoint realizando los siguientes pasos:

    • Seleccionamos el servidor SQL Server donde queramos guardar la base de datos
    • Pulsamos sobre New para crear esta base de datos, especificamos las credenciales con permisos necesarios en el SQL Server para crear bases de datos y establecemos un nombre a la base de datos, ReportServer
    • Por último seleccionamos la opción Create the report server database in SharePoint integrated mode para integrarlo con SharePoint y pulsamos Ok.




    • Nos aparecerá una pantalla en la que volveremos a especificar las credenciales de un usuario con privilegios administrativos que el servidor usará para acceder a la base de datos.

  • Por último, pulsamos sobre Web Service Identity y seleccionamos el application pool que queremos que tenga asociado nuestro sitio web ReportServer.



Ahora que ya tenemos configurado todos los parámetros del Reporting Services, pulsamos sobre la opción de SharePoint Integration y vemos que aparece un enlace que nos abrirá la administración central de SharePoint para poder seguir con la configuración.



Nota: Una consideración a tener en cuenta, es que si instalamos el servidor de Reporting Services en una maquina diferente a donde tenemos instalado SharePoint, tendremos que realizar una instalación básica de SharePoint en este servidor para que tenga disponible el modelo de objetos de SharePoint.


Configuración del servidor SharePoint


Una vez que ya tenemos configurado nuestro servidor de Reporting Services y después de ejecutar el programa de instalación de Microsoft SQL Server 2005 Reporting Services Add-in para Microsoft SharePoint Technologies en el servidor de SharePoint, vamos a configurar nuestro servidor SharePoint. Para ello, si vamos a la administración central de SharePoint y pulsamos sobre la ficha de Application Management podremos ver el nuevo menú de Reporting Services que nos ha añadido estos add-in.



Este menú está compuesto por tres apartados diferentes que tendremos que configurar uno a uno para terminar de configurar nuestro servidor, y que sirven para:



  • Manage integration settings: Configurar la URL de acceso al servidor de Reporting Services (ej. http://ServerName:8080/reportserver) y su modo de auntentificación (Windows o trusted account)



  • Grant database Access: Configurar el nombre del servidor donde se encuentra la base de datos de Reporting services y las credenciales necesarias para poder acceder a ella.




  • Set Server defaults: Modificar otros parámetros de la configuración como los timeout de acceso, habilitar los logs, …


Una vez que hayamos terminado de realizar todos estos pasos, ya tendremos configurado nuestro servidor SharePoint para poder utilizar Reporting Services.


En los próximos post veremos cómo podemos desarrollar informes y trabajar con ellos desde SharePoint.


Links de descargas:

















Microsoft SQL Server 2005 Reporting Services Add-in para Microsoft SharePoint Technologies


Microsoft SQL Server 2005 SP 2


Descarga


Descarga


Novedades


Novedades

Configuración de SharePoint con varios modelos de autentificación

Vamos a explicar los pasos que hay que seguir para configurar dentro de en un mismo sitio SharePoint diferentes formas de autentificación, ya que es una situación típica en escenarios de intranet/internet, que necesitan autentificación Windows (mediante directorio activo o cuentas locales) para su zona intranet y para internet, habilitar el acceso anónimo y la autentificación basada en formularios, que la conseguimos gracias a los Membership Provider que nos proporciona ASP.Net 2.0.

Para poder configurar todo nuestro escenario, vamos a realizar los siguientes pasos:

  1. Creación de dos Web Applications, una para cada modelo de autentificación
  2. Generación de una base de datos en un servidor SQL para almacenar las cuentas de usuarios y roles.
  3. Cambiar el modo de autentificación de la Web Application correspondiente a la zona internet para que disponga de acceso anónimo y poder validarse con los usuarios creados en la base de datos.

Creación del sitio intranet à http://wssgob.com

Una vez que hayamos terminado de instalar y configurar Windows SharePoint Services v3 (ó la versión de MOSS) en nuestro entorno de servidores, vamos a crear una nueva Web Application con su correspondiente colección de sitios. Para ello desde el sitio de la Administración Central de SharePoint, seleccionamos en la ficha de Application Management la opción de Create or Extend Web Application, pulsamos sobre Create a New Web Application y rellenamos el formulario con los siguientes parámetros:

·         Descripción: wssgob.com

·         Puerto: 80

·         Authentication Provider: NTLM

·         Acceso Anónimo: No

·         Por último los correspondiente parámetros de acceso al servidor SQL para alojar la base de datos de contenido del sitio

Después de crear la Web application, crearemos una colección de sitios asociada a esta Web application, entrando en la ficha de Application Management pulsamos la opción Create Site Collection y después la configuramos con los siguientes datos:

·         Web Application: http://wssgob.com

·         Título: CIIN

·         Plantilla: Team Site

 

Hasta ahora lo que hemos realizado es una web application con su correspondiente colección de sitios, http://wssgob, configurada mediante autentificación Windows y cuentas de directorio activo, que es la que SharePoint utiliza por defecto.

     

Creación del sitio internet à http://internet.wssgob.com

Después de comprobar que nuestro sitio intranet funciona correctamente, vamos a extender la web application a otro sitio web del IIS, que será el que configuremos con acceso anónimo y la autentificación basada en formularios.

Para extender la Web Application de la intranet a un nuevo sitio web del IIS, tenemos que ir a la Administración Central de SharePoint, seleccionar en la ficha de Application Management la opción de Create or Extend Web Application, pulsamos sobre Extend an Existing Web Application. Al rellenar estos datos tenemos que prestar atención a la web application que estemos seleccionando, ya que tiene que ser la correspondiente a la de la zona intranet que hemos creado en el apartado anterior.

·         Web Application: http://wssgob.com

·         Puerto: 80

·         Host Header: internet.wssgob.com

·         Authentication Provider: NTLM

·         Acceso Anónimo: No

·         Zona: Internet

     

Creación de la base de datos para almacenar los usuarios

El siguiente paso para la configuración de nuestro escenario con dos formas de autentificación, siendo una de ellas la basada en formularios, es la creación de la base de datos que aloje la información de los usuarios y roles que generemos. Microsoft proporciona un comando aspnet_regsql.exe que está disponible con la instalación del .Net framework 2.0, que realiza todo el trabajo de creación de las tablas necesarias en un servidor SQL. En este paso podríamos crearnos una base de datos personalizada, en un servidor de bases de datos diferentes, etc… El procedimiento para crearla lo podemos ver en este Link.

Para crear la base de datos con este comando seguimos los siguientes pasos:

  1. Abrir una consola de símbolo de sistema y acceder a la carpeta de %windir%Microsoft.NETFrameworkv2.0.5027
  2. Ejecutar el siguiente comando aspnet_regsql –A all –E

Descripción de los parámetros:

-A all: Especifica que queremos instalar la feature de usuarios y roles

-E: Indica que usaremos autentificación Windows para conectar al SQL Server

Para ver el resto de parámetros que se pueden utilizar ejecutar aspnet_regsql /?

  1. Este comando nos creará la base de datos aspnetdb en el servidor SQL local en donde lo ejecutemos.

Una vez que tengamos creada la base de datos tendremos que crear los primeros usuarios y roles, para ello existen varios métodos. El primero sería terminar de configurar nuestro sitio SharePoint para con los dos modelos de autentificación y después crear una página aspx dentro de la administración central con SharePoint Designer y agregando un control de ASP.Net para crear usuarios en base de datos,


El otro método es realizarlo desde Visual Studio, creando un nuevo sitio web y configurar el web.config para que acceda a la base de datos del servidor SQL y así, desde la opción de ASP.Net Configuration del menú de Visual Studio acceder al sitio web de la administración de ASP.Net y poder crear los usuarios y roles.

  

Habilitar la autentificación basada en formularios a Web Applications de la zona internet

Una vez que ya tenemos creadas las dos web applications y la base de datos que va a almacenar a los usuarios y roles, necesitamos modificar el fichero de configuración web.config del sitio de la zona internet y el de la administración central de SharePoint para que pueda acceder a la base de datos y poder utilizar la autentificación basada en formularios.

Editamos el web.config de la web application que queremos que tenga este método de autentificación de la siguiente manera:

  • Crearemos una copia de seguridad del fichero de configuración, web.config
  • Abrimos el fichero y debajo de la etiqueta de </SharePoint> añadimos la cadena de conexión de la base de datos:


<connectionStrings>

<add name=”AspNetSqlProvider” connectionString=”server=NombreSqlServer; database=aspnetdb; Trusted_Connection=True” />

</connectionStrings>

  • Después, dentro de la etiqueta <system.web>, ponemos el código para configurar la creación de los usuario y roles:


<membership defaultProvider=”AspNetSqlMembershipProvider”>

<providers>

<remove name=”AspNetSqlMembershipProvider” />

    <add connectionStringName=”AspNetSqlProvider”

passwordAttemptWindow=”10″

enablePasswordRetrieval=”false”

enablePasswordReset=”true”

requiresQuestionAndAnswer=”true”

applicationName=”/”

requiresUniqueEmail=”false”

passwordFormat=”Hashed”

description=”Almacena los usuarios y roles en la base de datos de SQL Server”

name=”AspNetSqlMembershipProvider”

Type=”System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” />

</providers>

</membership>

       

<roleManager enabled=”true” defaultProvider=”AspNetSqlRoleProvider”>

<providers>

<remove name=”AspNetSqlRoleProvider” />

<add connectionStringName=”AspNetSqlProvider”

applicationName=”/”

description=” Almacena los usuarios y roles en la base de datos de SQL Server”

name=”AspNetSqlRoleProvider”

type=”System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” />

</providers>

</roleManager>

  • Al acabar, guardamos el fichero y lo cerramos

Una vez que ya hemos modificado el web.config de la web application que queremos que tenga la validación por formularios, debemos realizar estos mismos pasos en el fichero de configuración web.config del sitio donde está alojado la administración central de SharePoint, modificando solamente la línea donde se especifica el administrador de los roles:


<roleManager enabled=”true” defaultProvider=”AspNetWindowsTokenRoleProvider”>

Después de realizar estas modificaciones a los ficheros de configuración, tan solo queda cambiar los parámetros de autentificación la web application del sitio de la zona de internet para que utilice la autentificación basada en formularios que acabamos de crear.

Para realizarlo, abrimos la administración central de SharePoint, y en la pestaña de Application Management pulsamos sobre Authentication Provider. Lo primero que debemos hacer es seleccionar la web application correcta en la parte superior, y como observamos en la imagen están la dos zona configuradas mediante autentificación Windows:

 

Cuando ya hemos seleccionado la Web Application correcta, pulsamos sobre la zona internet y modificamos los parámetros de la autentificación que está utilizando, cambiándolo para que tenga autentificación basada en formularios y permitiendo el acceso anónimo:

·         Tipo de autentificación: Forms

·         Acceso Anónimo: Si

·         Membership Provider Name: AspNetSqlMembershipProvider

·         Role Manager Name: AspNetSqlRoleProvider

Los valores de Membership Provider y de Role Manager son los que hemos definido en los ficheros de configuración web.config en el paso anterior.

 

Al acabar de realizar todos estos pasos habremos finalizado la configuración de nuestro sitio SharePoint para que disponga dos formas diferentes de acceso, cada una de ellas con un método de autentificación diferente:

·         http://wssgob.com, autentificación Windows (Cuentas de usuario de directorio Activo o cuentas locales)

·         http://internet.wssgob.com, Acceso anónimo o autentificación basada en formularios