Integración de aplicaciones personalizadas de Silverlight 4 con SharePoint Server 2010

Resumen: aprenda a usar el modelo de objetos de cliente administrado de SharePoint Foundation 2010 para trabajar con código Microsoft Visual C# administrado en el contexto de aplicaciones de Silverlight 4 personalizadas para consumir y trabajar con datos de listas de SharePoint.

Última modificación: viernes, 02 de diciembre de 2011

Hace referencia a: Business Connectivity Services | Office 2010 | Open XML | SharePoint | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

En este artículo
Introducción
Ventajas para el desarrollo con el modelo de objetos de cliente administrado de SharePoint Foundation 2010
Escenarios comunes de integración de aplicaciones de Silverlight personalizadas y SharePoint Server 2010
Información general sobre el escenario: Combinar Silverlight y SharePoint para crear un panel
Crear el panel de incidentes
Conclusión
Recursos adicionales
Acerca del autor

Se aplica a:  Microsoft SharePoint Server 2010 | Microsoft SharePoint Foundation 2010 | Microsoft Silverlight 4

Proporcionado por:  Casey Margell, FooBarbarians

Contenido

  • Introducción

  • Ventajas para el desarrollo con el modelo de objetos de cliente administrado de SharePoint Foundation 2010

  • Escenarios comunes de integración de aplicaciones de Silverlight personalizadas y SharePoint Server 2010

  • Información general sobre el escenario: Combinar Silverlight y SharePoint para crear un panel

  • Crear el panel de incidentes

    • Crear la aplicación de Silverlight 4 con Visual Studio 2010

    • Agregar referencias a los ensamblados del modelo de objetos de cliente administrado de SharePoint Foundation 2010

    • Agregar una instrucción Using al modelo de objetos de cliente administrado

    • Obtener datos de listas de SharePoint

    • Resolver llamadas entre dominios y de seguridad

    • Agregar y actualizar los datos de listas de SharePoint

  • Agregar compatibilidad con características específicas de Silverlight 4

    • Habilitar la impresión con Silverlight 4

    • Implementar la compatibilidad con clic con el botón secundario en Silverlight 4

    • Habilitar operaciones de Portapapeles en Silverlight 4

    • Crear elementos web de Silverlight en SharePoint Foundation 2010

  • Conclusión

  • Recursos adicionales

  • Acerca del autor

Hacer clic para obtener el código  Descargue el código de ejemplo de la Galería de códigos MSDN

Introducción

Uno de los avances realizados en Microsoft SharePoint Foundation 2010 es la introducción del modelo de objetos de cliente administrado de SharePoint Foundation 2010. El modelo de objetos de cliente administrado proporciona un marco para obtener acceso a varios orígenes de datos de SharePoint a partir del código administrado basado en .NET Framework y JavaScript/ECMAScript (JavaScript, JScript). Antes había que usar la API del servidor y probar el código directamente en el servidor que hospeda la instalación de SharePoint Server. El modelo de objetos de cliente administrado permite crear aplicaciones que tiene acceso y trabajan con datos de SharePoint y realizar tareas de configuración sin escribir ni instalar código directamente en el equipo servidor.

Este artículo forma parte de una serie de artículos que describen cómo integrar aplicaciones cliente junto con procesos de negocio y flujos de trabajo:

Ventajas para el desarrollo con el modelo de objetos de cliente administrado de SharePoint Foundation 2010

El modelo de objetos de cliente administrado de SharePoint Foundation 2010 proporciona un marco del lado del cliente para trabajar con los objetos comunes de sitios de SharePoint Server. Para más información, vea Uso del modelo de objetos de cliente administrado de SharePoint Foundation 2010. Las aplicaciones que sacan provecho del modelo de objetos de cliente administrado pueden realizar operaciones similares a los que admite el modelo de objetos del lado servidor.

A medida que el uso y las características de SharePoint se vuelven más comunes y más necesarios en las organizaciones, suele recurrirse a los equipos de TI para que proporcionen compatibilidad con las características de la API de SharePoint desde implementaciones de productos y tecnologías de SharePoint externos. Antes, esto se lograba mediante el uso de servicios web de SharePoint Server o, cuando dichos servicios no proporcionaban las funciones necesarias, mediante un servicio web personalizado que se ejecutaba junto con la implementación de SharePoint que usaba el modelo de objetos del lado del servidor. Estos servicios eran de creación no trivial y mantener los diferentes extremos y la sincronización de las definiciones solía causar problemas. Además, la implementación de código del lado del servidor puede generar resistencia en la organización o ser directamente imposible. SharePoint Foundation 2010 proporciona un modelo de objetos de cliente administrado con unas características similares para mejorar la flexibilidad de los entornos en los que se pueden usar datos y funciones de SharePoint Server y para simplificar el desarrollo de aplicaciones.

El modelo de objetos de cliente administrado alivia la carga, ya que proporciona un marco común para las aplicaciones basadas en .NET Framework. Estas aplicaciones no dependen del código del servidor. Por lo tanto, son más fáciles de configurar, implementar, mantener y desarrollar. La integración del modelo de objetos de cliente administrado en aplicaciones de Silverlight es sencillo y predecible.

Escenarios comunes de integración de aplicaciones de Silverlight personalizadas y SharePoint Server 2010

A continuación, se presentan algunos ejemplos de escenarios:

  1. Presentar contenido de sitios de SharePoint internos mediante el uso de Silverlight en un sitio público

  2. Crear una aplicación de Silverlight dirigida a empresas que usa productos y tecnologías de SharePoint para almacenamiento, autenticación e informes

  3. Presentar de forma dinámica datos de listas de sitios de SharePoint mediante el uso de Silverlight

Estos escenarios muestran algunas de las necesidades y funcionalidades principales que deben tenerse en cuenta:

  • Acceso a datos y características de SharePoint

  • Autorización

  • Autenticación

En este artículo se describe cómo tener acceso y consumir datos de SharePoint trabajando con datos de listas de SharePoint desde una aplicación de Silverlight 4.

Información general sobre el escenario: Combinar Silverlight y SharePoint para crear un panel

En este escenario, Contoso Inc., una compañía de seguros, usa Microsoft SharePoint Server 2010 para administrar datos y flujos de trabajo. En este escenario se encapsula toda la duración de una notificación: desde cómo se informa acerca del incidente a cómo se aprueba y completa el trabajo. El flujo de trabajo de la notificación se administra en SharePoint Server 2010 y se puede hacer referencia a él fácilmente cuando se debe comprobar el estado de una notificación específica.

Contoso implementó una infraestructura que usa Microsoft SharePoint Server 2010 y Microsoft Office 2010 para facilitar y agilizar el procesamiento de incidentes. Este proceso conlleva varias aplicaciones que se usan a nivel interno y externo. También usan diferente tecnología, desde clientes móviles a equipos de escritorio. Pero todas ellas tienen algo en común: el modelo de objetos de cliente administrado de SharePoint Server 2010 y SharePoint Foundation 2010.

En este escenario, crearemos un panel de Silverlight para los agentes de servicio de silverlightnv2customer de Contoso para mostrar cómo se presentan los datos de SharePoint mediante el uso de funcionalidades de Silverlight para ofrecer una experiencia de usuario enriquecida y eficaz.

Roles en el escenario de Silverlight

  • Don Funk, conductor (víctima de accidente automovilístico), cliente de Contoso, Inc.

  • April Regan, agente de atención al cliente de Contoso, Inc.

  • Rob Young, agente de seguros de Contoso, Inc.

  • Jeff Ford, administrador de taller de carrocería y asociado con Contoso, Inc.

Flujo de eventos

Figura 1. Flujo de eventos

Flujo de eventos

Una gran tormenta eléctrica atravesó el barrio de Don Funk. Vientos muy fuertes derribaron un árbol que cayó sobre el coche de Don. Don saca fotografías del daño con la cámara de su teléfono y las envía a su compañía de seguros, junto con un informe del incidente a través del teléfono móvil para enviar su reclamación.

En la compañía de seguros se recibe el envío y se agrega a una lista de tareas. Un agente de atención al cliente, April, recibe la notificación, revisa los datos para asegurarse de que toda la información necesaria esté presente y pasa el incidente al agente del cliente, Rob Young.

Se crea una tarea para que Rob Young investigue la reclamación y la apruebe o la rechace. Rob Young revisa el informe del incidente y después se reúne con Don para realizar una inspección y obtener más información acerca del incidente. Concluye que no hay ningún fraude, aprueba la reclamación y envía una solicitud para obtener presupuestos de reparación. La tarea asignada a Rob se actualiza y el flujo de trabajo asigna una nueva tarea al administrador de un taller de reparaciones, Jeff Ford, para que envíe una oferta para el trabajo de reparación.

Cuando se notifica a Jeff que Contoso, Inc. tiene una nueva solicitud de oferta, entra en la extranet de Contoso, Inc. y rellena un formulario de oferta. Jeff gana la oferta para el trabajo y programa una cita con Don para realizar el trabajo en su coche.

Al finalizar las reparaciones, Jeff factura a Contoso.

Detalles del flujo de trabajo del escenario

El flujo de trabajo de nuestro escenario se inicia cuando Don Funk envía el incidente a través del teléfono móvil. La figura 2 muestra la parte del flujo de trabajo que se aplica a este documento.

Figura 2. Diagrama del flujo de trabajo

Diagrama de flujo de trabajo

Cuando se inicia nuestro escenario, nuestro cliente, Don Funk, usa la aplicación móvil para enviar una notificación y proporcionar detalles del incidente. La aplicación móvil comunica los detalles del incidente a través de un servicio de Windows Communication Foundation (WCF) que se ejecuta junto con la instalación de SharePoint Server 2010. El servicio crea un elemento en la lista de incidentes, tal como se muestra en la figura siguiente.

Figura 3. Lista de incidentes

Lista de incidentes

Cuando se crea un elemento en la lista de incidentes, SharePoint inicia automáticamente un flujo de trabajo personalizado. El flujo de trabajo asigna una tarea a nuestra representante del servicio al cliente, April Regan. En este momento se envía un mensaje de correo electrónico a nuestra representante del servicio al cliente para avisarle acerca de la nueva tarea que se le ha asignado y a nuestros clientes para informarles que el incidente se ha recibido y que se está procesando.

Figura 4. Lista de tareas del incidente

Lista de tareas de incidente

Al recibir un mensaje de correo electrónico que le informa acerca de una nueva tarea asociada con la notificación, la representante de servicio al cliente, April, usa el panel de incidentes para revisar la notificación y desplazarla por el flujo de trabajo.

Crear el panel de incidentes

El panel de incidentes (figura 5) que usa nuestro escenario es una aplicación de Silverlight 4 creada con Microsoft Visual Studio 2010 que usa el modelo de objetos de cliente administrado. Este panel muestra las notificaciones abiertas y dónde está cada notificación en el ciclo de vida del flujo de trabajo. En esta sección se describe cómo crear una aplicación de Silverlight 4 en Visual Studio 2010, cómo agregar referencias a los ensamblados del modelo de objetos de cliente administrado y cómo usar el modelo de objetos de cliente administrado para trabajar con datos de SharePoint.

Figura 5. Panel de incidentes

Panel de incidente

Crear la aplicación de Silverlight 4 con Visual Studio 2010

Para crear aplicaciones de Silverlight 4 en Visual Studio 2010, primero debe instalar las herramientas de Silverlight 4 para Visual Studio 2010. Para descargar estas herramientas, vea Microsoft Silverlight 4 Tools para Visual Studio 2010. Después de instalar las herramientas de Silverlight, cree un proyecto en Visual Studio 2010 con la plantilla de aplicación Silverlight.

Para crear un proyecto de Silverlight en Visual Studio 2010 mediante la plantilla de aplicación de Silverlight

  1. Inicie Microsoft Visual Studio 2010.

  2. En el menú Archivo, elija Nuevo y, a continuación, haga clic en Proyecto.

  3. En el diálogo Nuevo proyecto, expanda el nodo Visual C# en Plantillas instaladas y, a continuación, seleccione Silverlight.

  4. En el panel central donde se enumeran los tipos de proyecto, seleccione Aplicación de Silverlight, tal como se muestra en la figura siguiente.

    Figura 6. Plantilla de aplicación de Silverlight en Visual Studio 2010

    Plantilla de aplicación de Silverlight

  5. En el cuadro de texto Nombre, escriba un nombre de proyecto, como Contoso.IncidentDashboard.

  6. En el cuadro de texto Ubicación, escriba la ruta de acceso de la ubicación donde se pueden almacenar los archivos de solución.

  7. Presione Aceptar.

Después de proporcionar un nombre de proyecto y una ubicación, Visual Studio le pregunta si desea agregar un proyecto de sitio web a la solución y la versión de Silverlight de destino, tal como se muestra en la figura siguiente. En este escenario, se agrega un proyecto de sitio web dirigido a Silverlight 4, tal como se muestra en la figura siguiente.

Figura 7. Creación del proyecto de sitio web con la versión de Silverlight en Visual Studio 2010 como objetivo

Creación del proyecto de sitio web

Agregar referencias a los ensamblados del modelo de objetos de cliente administrado de SharePoint Foundation 2010

A continuación, debe agregar referencias en el proyecto al modelo de objetos de cliente administrado para usar las características. Los dos ensamblados, Microsoft.SharePoint.Client.dll y Microsoft.SharePoint.Client.Runtime.dll, se encuentran en el siguiente directorio en el equipo que ejecuta SharePoint Foundation 2010:

%ProgramFiles%\Archivos comunes\Microsoft Shared\web server extensions\14\ISAPI

Para agregar referencias a los ensamblados del modelo de objetos de cliente administrado en Visual Studio 2010

  1. Haga clic con el botón secundario en el proyecto Contoso.IncidentDashboard.

  2. Seleccione Agregar referencia.

  3. Haga clic en Examinar.

  4. Busque la ubicación de los ensamblados Microsoft.SharePoint.Client.dll y Microsoft.SharePoint.Client.Runtime.

  5. Seleccione los dos ensamblados

  6. Presione Aceptar.

Después de agregar la referencia necesaria, el proyecto tiene un aspecto como el que muestra la siguiente figura.

Figura 8. Aplicación de Silverlight con referencias a los ensamblados del modelo de objetos de cliente en Visual Studio 2010

Aplicación de Silverlight con referencias

Agregar una instrucción Using al modelo de objetos de cliente administrado

El siguiente paso es agregar una instrucción Using al principio del archivo .cs. Trabajar con el modelo de objetos de cliente administrado es similar a trabajar con el modelo de objetos del lado del servidor. Para los que tienen experiencia con el modelo de objetos del lado servidor, los objetos y métodos de trabajo con dichos objetos son lógicos y fáciles de usar.

Para agregar una instrucción Using al modelo de objetos de cliente administrado

  1. Abra MainPage.xaml.cs

  2. Agregue la siguiente instrucción Using después de las existentes.

    using Microsoft.SharePoint.Client;
    

La configuración de las referencias y las instrucciones Using proporcionan acceso a los objetos que se definen en el ensamblado Microsoft.SharePoint.Client.

Obtener datos de listas de SharePoint

Los objetos [Microsoft.SharePoint.Client.ClientContext] y [Microsoft.SharePoint.Client.Web] constituyen el núcleo del modelo de objetos de cliente administrado. Sin estos objetos, ninguna de las demás operaciones puede funcionar. Debe usar variables a nivel de objeto para los objetos persistan durante las llamadas asincrónicas a lo largo de la ejecución de la aplicación.

Nota importanteImportante

Debe evitar el uso de varios objetos ClientContext, ya que algunos objetos de cliente, por ejemplo, ListItemCollection, son específicos de un determinado objeto ClientContext. Si intenta usar un objeto con otro objeto ClientContext que no sea el responsable de la creación del objeto, se pueden producir problemas.

Para recuperar datos de listas mediante el uso de variables

  1. Agregue las siguientes propiedades al objeto después de la definición de clase:

            private ClientContext _context = null;
            private Web _site = null;
            private ListItemCollection _incidentListItems = null;
    

    Las variables de tres miembros del ejemplo anterior son un objeto ClientContext que hace referencia al sitio de SharePoint para funcionar, un objeto Web que representa un sitio de SharePoint y un objeto ListItemCollection que se usa para recuperar los elementos de una lista de SharePoint usando el modelo de objetos de cliente administrado. Se usa un controlador de eventos para el evento Loaded en el objeto MainPage para inicializar las variables de miembro después de que se inicializan el objeto MainPage y sus elementos secundarios:

  2. Dentro del constructor MainPage, agregue el código siguiente después del método.

            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    
  3. Después del constructor MainPage, agregue el método siguiente.

            void MainPage_Loaded(object sender, RoutedEventArgs e)
            {
                _context = new ClientContext("http://intranet.contoso.com");
                _site = _context.Web;
    
                List list = _site.Lists.GetByTitle("Incidents");
                CamlQuery query = new CamlQuery();
                query.ViewXml =
                    @"<View>
                        <Query>
                            <Where>
                                <Neq>
                                    <FieldRef Name='Status' />
                                    <Value Type='Choice'>Closed</Value>
                                </Neq>
                            <Where>
                        <Query>
                    </View>";
    
                _incidentListItems = list.GetItems(query);
                _context.Load(_incidents);
                _context.ExecuteQueryAsync(
                    onGetIncidentsSucceeded, 
                    onGetIncidentsFailed
                    );
            }
    

    Este código inicializa el objeto ClientContext y le pasa la dirección URL del sitio al que debe hacer referencia. A continuación, se recupera el objeto Web del objeto ClientContext. Ambos se almacenan en variables de miembro para mantener la referencia a ellos.

Este procedimiento muestra el patrón que se debe seguir cuando se trabaja con el modelo de objetos de cliente administrado de Silverlight.

  • Establezca una referencia al objeto lógico con el que desea trabajar.

  • Configure la acción que se llevará a cabo.

  • Ejecute la acción, proporcionando métodos de devolución de llamada para operaciones correctas y con errores.

Siguiendo este patrón, el ejemplo anterior realiza los pasos siguientes:

  • Establece una referencia a la lista de incidentes

  • Crea un objeto [Microsoft.SharePoint.Client.CamlQuery] y establece su consulta. En este escenario, esto significa obtener elementos de la lista de incidentes que no tienen el estado Cerrado.

  • Llama el método [Microsoft.SharePoint.Client.List.GetItems] y almacena el resultado en la variable de miembro ListItemCollection. Se proporciona el objeto [Microsoft.SharePoint.Client.CamlQuery] al método [Microsoft.SharePoint.Client.List.GetItems]. De esta forma, se definen los resultados esperados por nuestra operación Get.

Antes, se mencionaron brevemente las operaciones asincrónicas. Ahora veremos qué son y por qué son importantes. Cuando se trabaja en Silverlight, no se debe bloquear la interfaz de usuario mientras se espera que la consulta devuelva resultados. Al esperar a que finalice una operación asincrónica, es importante proporcionar comentarios visuales al usuario de que está ocurriendo algo y no bloquear la interfaz de usuario. Si no hay cambios en la interfaz de usuario, el usuario no dispone de ninguna indicación de que algo está ocurriendo en el back-end. Al llamar el método [Microsoft.SharePoint.Client.ClientRunTimeContext.ExecuteQueryAsync], se proporcionan controladores de eventos para indicar que la operación se realizó correctamente o con errores.

Como se muestra en la Crear la aplicación de Silverlight 4 con Visual Studio 2010, cuando se obtiene la lista de elementos de incidente, el panel debe indicar cuántas notificaciones entran en cada categoría. También debe indicar los elementos de incidente que se incluyen en categorías particulares de la lista. Este es un buen momento para destacar una de las implicaciones de realizar una operación asincrónica. Las devoluciones de llamadas para operaciones asincrónicas no ejecutan el mismo subproceso que la interfaz de usuario. Por lo tanto, un intento de modificar la interfaz de usuario desde dentro de dicha devolución de llamada produce una excepción. Para solucionar este problema, puede usar un delegado personalizado y un método adicional como se muestra en el ejemplo siguiente. Agregue el siguiente código después del método MainPage_Loaded.

        private void onGetIncidentsSucceeded(
            object sender, 
            ClientRequestSucceededEventArgs args
            )
        {
            UpdateIncidentsSummary();
        }

        private delegate void UpdateIncidentsSummaryDelegate();
        private void UpdateIncidentsSummary()
        {
            if (!this.Dispatcher.CheckAccess())
            {
                this.Dispatcher.BeginInvoke(
                    new UpdateIncidentsSummaryDelegate(UpdateIncidentsSummary)
                    );
                return;
            }

            int newIncidents = 0;
            //... Additional counter variables

            foreach (ListItem listItem in _incidentListItems)
            {
                string status = (string)listItem["Status"];

                switch (status)
                {
                    case "New":
                        newIncidents++;
                        break;
                    //... Additional cases for the different statuses
                }
            }

            this.txtNewIncidentCount.Text = newIncidents.ToString();
            //... Set Additional Count display controls
        }

Siguiendo con este ejemplo, el método onGetIncidentsSucceeded llama el método UpdateIncidentsSummary. El método UpdateIncidentSummary comprueba si tiene acceso a la interfaz de usuario mediante el método Dispatcher.CheckAccess. Si no es así, crea un delegado en el método UpdateIncidentSummary que se ejecuta en el subproceso de interfaz de usuario.

Esta comprobación se realiza para cada actualización de estado. Una vez completado el proceso, la interfaz de usuario se actualiza para reflejar los recuentos actuales.

Ahora vamos a revisar el controlador de errores.

Agregue el siguiente bloque de código después del método UpdateIncidentSummary.

     private void onGetIncidentsFailed(
            object sender, 
            ClientRequestFailedEventArgs args
            )
        {
            Alert("An Error Occurred Retreiving Incidents. Please refresh the page and try again:\n\n" + args.Exception);
        }

        private delegate void AlertDelegate(string message);
        private void Alert(string message)
        {
            if (!this.Dispatcher.CheckAccess())
            {
                this.Dispatcher.BeginInvoke(new AlertDelegate(Alert), message);
                return;
            }
            MessageBox.Show(message);
        }

Recorriendo brevemente este ejemplo, el patrón general es el mismo. El controlador realiza una llamada a un método que comprueba el acceso a la interfaz de usuario. Si no tiene acceso, invoca un delegado personalizado en el subproceso de interfaz de usuario. Cabe destacar que el objeto ClientRequestFailedEventArgs tiene una propiedad Exception. Contiene una excepción que se detectó y es muy útil para realizar un seguimiento del motivo por el que se produjo la excepción.

Si realiza un seguimiento de su propio proyecto, presione F5 para iniciar la depuración y verá un error, como se muestra en la figura siguiente.

Figura 9. Excepción de seguridad detectada durante la actualización del resumen de incidentes

Figura 9

Se ha producido esta excepción porque la ubicación de depuración está en un dominio diferente al del sitio de SharePoint. Visual Studio 2010 asigna automáticamente un puerto a la instancia del equipo de desarrollo de servidor que ejecuta ASP.NET que genera para admitir la depuración. En la siguiente sección se describe cómo atenuar este problema.

Resolver llamadas entre dominios y de seguridad

El acceso a un recurso en un dominio desde un dominio independiente y las implicaciones de seguridad de hacerlo se conoce como llamadas entre dominios. En nuestro caso queremos realizar una llamada entre dominios a nuestra instancia de SharePoint de destino desde nuestro entorno de depuración. La forma de solucionar este problema es usar un archivo de directivas de acceso entre dominios.

Las directivas de acceso entre dominios abordan problemas de seguridad asociados con permitir el acceso entre dominios. Las directivas de acceso entre dominios se configuran mediante un archivo XML denominado clientaccesspolicy.xml . Este archivo se almacena en la raíz del directorio virtual que hospeda el sitio. Por ejemplo, en este escenario, almacené el archivo en la siguiente ubicación:

C:\InetPub\wwwroot\wss\VirtualDirectories\80\

El ejemplo de código siguiente es un archivo de directivas de acceso de cliente muy sencillo.

<?xml version="1.0" encoding="utf-8" ?> 
<access-policy> 
    <cross-domain-access> 
        <policy> 
            <allow-from> 
                <domain uri="*"/> 
            </allow-from> 
            <grant-to> 
                <resource include-subpaths="true" path="/"/> 
            </grant-to> 
        </policy> 
    </cross-domain-access> 
</access-policy>

Al examinar este archivo XML, hay configurada una directiva que permite solicitudes de todos los dominios y concede permiso a todos los recursos del sitio. Si bien no se recomienda esta directiva de acceso amplia para un entorno de producción, puede ser útil para el entorno de desarrollo. Tenga en cuenta que se necesita el acceso del administrador al equipo servidor que ejecuta SharePoint Foundation 2010para seguir estos pasos.

Para crear un archivo de directivas de acceso de cliente para el entorno de desarrollo

  1. Cree un archivo de texto con el nombre clientaccesspolicy.xml.

  2. Agregue el código XML anterior al archivo.

  3. Guarde los cambios y cierre el archivo.

  4. Copie este archivo en la raíz de la aplicación web.

    Figura 10. ClientAccessPolicy.xml

    ClientAccessPolicy.xml

    Después de guardar este archivo en la ubicación apropiada, reinicie Microsoft Internet Information Services (IIS).

  5. Presione Inicio.

  6. En el menú Inicio, expanda Todos los programas y expanda la carpeta Accesorios.

  7. Haga clic con el botón secundario en Símbolo del sistema y, a continuación, haga clic en Ejecutar como administrador.

  8. Tipo iisreset. y, a continuación, presione ENTRAR , como se muestra en la figura siguiente.

    Figura 11. Reinicio del sitio

    Reinicio del sitio

Después de crear el archivo de directivas de acceso de cliente y de reiniciar IIS, debería poder depurar la aplicación sin errores.

Agregar y actualizar los datos de listas de SharePoint

Ahora veamos brevemente cómo agregar y actualizar elementos de listas. Tenga en cuenta que en el ejemplo no se muestra la devolución de llamada correcta ni la devolución de llamada con errores debido a que se proporcionaron ejemplos anteriormente en este artículo. Agregar un elemento no es una tarea compleja, como se muestra en el ejemplo siguiente.

        List incidents = _site.Lists.GetByTitle("Incidents");

        ListItemCreationInformation listingListItemCreation = 
            new ListItemCreationInformation();
        ListItem item = incidents.AddItem(listingListItemCreation);
        item["Title"] = (string) . . .
        . . .
        item.Update();
        
        _context.ExecuteQueryAsync(onQuerySucceeded, onQueryFailed);

El ejemplo sigue el patrón descrito anteriormente (obtener el objeto con el que se desea trabajar, configurar la acción, ejecutar). En este ejemplo se realizan las acciones siguientes:

  • Obtener la lista a la que se agrega un elemento.

  • Configurar un objeto ListItemCreationInformation y usarlo para crear un objeto ListItem en la lista. Después de crear el objeto ListItem, establezca los valores de campo.

  • Ejecutar la consulta.

La actualización de creación de elementos sigue el mismo patrón que se presentó anteriormente. Para mayor simplicidad, supongamos que el código anterior recuperó los elementos de la lista de incidentes (y almacenó los resultados en _incidentListItems). En el ejemplo de código siguiente se actualiza el estado de los elementos de la lista para mostrar el estado Closed.

        foreach (ListItem incident in _incidents)
        {
            incident["Status"] = "Closed";
            incident.Update();
        }

        _context.ExecuteQueryAsync(onQuerySucceeded, onQueryFailed);

Como se muestra en los ejemplos siguientes, el modelo de objetos de cliente administrado simplifica el proceso de desarrollo y ayuda a proporcionar compatibilidad adicional para el desarrollo de experiencias de usuario enriquecidas que usan el marco de Silverlight.

Agregar compatibilidad con características específicas de Silverlight 4

Ahora que hemos proporcionado acceso general a los datos en el panel de servicio al cliente de nuestro escenario, el siguiente paso es agregar compatibilidad con determinadas características de Silverlight 4. Las secciones siguientes agregan compatibilidad con la impresión, clic con el botón secundario y Portapapeles. También existen otras características. Para más información acerca de las funcionalidades de Silverlight, vea el sitio web de Silverlight.NET (en inglés).

Habilitar la impresión con Silverlight 4

Silverlight 4 presenta una API de impresión que se puede usar para habilitar la impresión dentro de las aplicaciones. Las versiones anteriores de Silverlight carecían de esta compatibilidad y, por lo tanto, se requería mucho trabajo para compensar esa falta de flexibilidad. La compatibilidad con impresión de Silverlight 4 es muy flexible y fácil de usar.

Para habilitar la impresión, le conviene usar el objeto PrintDocument. En el ejemplo siguiente se muestra cómo usar el objeto PrintDocument para imprimir.

Para implementar el objeto PrintDocument de Silverlight 4

  1. Agregue un control de botón a su MainPage.xaml como se indica a continuación.

                <Button x:Name="bttnPrint" Content="Print" Click="bttnPrint_Click" />
    
  2. Agregue el siguiente controlador de eventos a MainPage.xaml.cs después del método Alert.

            private void bttnPrint_Click(object sender, RoutedEventArgs e)
            {
                PrintDocument printDoc = new PrintDocument();
                printDoc.PrintPage += (s, args) =>
                {
                    args.PageVisual = LayoutRoot;
                };
    
                printDoc.Print();
            }
    

Las partes clave de este ejemplo para destacar son las siguientes:

  • Crea el objeto PrintDocument.

  • Agrega un controlador de eventos (en este caso, un método anónimo) que configura el objeto PrintPageEventArgs según lo que se desea imprimir y la forma de hacerlo.

  • Llama el método Print del objeto PrintDocument.

Como alternativa, puede crear un diseño de impresión personalizado que no coincida con el diseño visual predeterminado de la aplicación de Silverlight. En nuestro ejemplo, supongamos que los elementos de la lista de incidentes se almacenan en una lista de un tipo personalizado.

            private List<Incident> _incidents = new List<Incident>();

En el controlador de eventos PrintPage, se puede usar la lista como el objeto ItemSource para un objeto DataGrid de Silverlight. Puede proporcionar el objeto DataGrid como objeto PageVisual al objeto PrintPageEventArgs en el controlador de eventos PrintPage, como se muestra en el siguiente ejemplo de código.

            printDoc.PrintPage += (s, args) =>
            {
                DataGrid dataGrid = new DataGrid();
                dataGrid.ItemsSource = _incidents;
                dataGrid.AutoGenerateColumns = true;
                
                args.PageVisual = dataGrid;
            };

En la figura siguiente se muestran los resultados si se prueba el código imprimiéndolo a Microsoft OneNote 2010.

Figura 12. Prueba de los resultados de impresión de la vista de cuadrícula de datos en OneNote

Prueba de impresión de resultados

Implementar la compatibilidad con clic con el botón secundario en Silverlight 4

Silverlight 4 ofrece la posibilidad de invalidar los eventos del clic con botón secundario. En versiones anteriores, al hacer clic con el botón secundario aparecía un menú integrado como se muestra en la figura siguiente.

Figura 13. Menú de botón secundario predeterminado de Silverlight

Menú contextual predeterminado

La capacidad de invalidar este menú y proporcionar eventos personalizados ofrece más oportunidades para personalizar las interfaces de usuario y agregar características.

A un nivel alto, para implementar eventos de clic con el botón secundario, debe:

  • Definir un lienzo que contenga un control emergente con el contenido que se muestra para los eventos de botón secundario del mouse.

  • Definir la respuesta a los eventos del mouse adecuados para controlar la visibilidad y posición de la ventana emergente.

El siguiente procedimiento le guiará a través de este proceso.

Para agregar eventos personalizados de clic con botón secundario a una aplicación de Silverlight

  1. En primer lugar, agregue un lienzo que contenga un control emergente al archivo MainPage.xaml.cs después del control LayoutRoot, tal como se muestra en el ejemplo siguiente.

            <Canvas x:Name="pnlPop" 
                    Background="Transparent" 
                    Visibility="Collapsed">
                <Popup x:Name="popMenu" IsOpen="False">
                    <Border Background="LightGray" 
                            CornerRadius="5">
                        <StackPanel Margin="5">
                            <Button Content="Escalate to Supervisor" />
                            <Button Content="Email Customer" />
                        </StackPanel>
                    </Border>
                </Popup>
            </Canvas>
    

    Este marcado XML define controles visualmente formados por un borde con esquinas redondeadas que contiene dos botones.

  2. A continuación, agregue controladores de eventos para los eventos MouseRightButtonDown, MouseRightButtonUp y MouseLeftButtonDown al control principal, tal como se muestra en el ejemplo siguiente.

        <Grid x:Name="LayoutRoot" 
              Background="White" 
              MouseRightButtonDown="LayoutRoot_MouseRightButtonDown" 
              MouseRightButtonUp="LayoutRoot_MouseRightButtonUp" 
              MouseLeftButtonDown="LayoutRoot_MouseLeftButtonDown">
    
  3. Agregue el controlador del evento MouseRightButtonDown a MainPage.xaml.cs:

            private void LayoutRoot_MouseRightButtonDown(
                object sender, MouseButtonEventArgs e)
            {
                e.Handled = true;
            }
    
    Nota importanteImportante

    El controlador de eventos del ejemplo de código anterior es necesario a pesar de que parezca no hacer demasiado. Si el control no trata el evento MouseRightButtonDown, el núcleo de Silverlight no genera el evento MouseRightButtonUp para la aplicación.

  4. Agregue el siguiente controlador de eventos MouseLeftButtonDown a MainPage.xaml.cs.

            private void LayoutRoot_MouseLeftButtonDown(
                object sender, MouseButtonEventArgs e)
            {
                this.pnlPop.Visibility = System.Windows.Visibility.Collapsed;
                this.popMenu.IsOpen = false;
            }
    

En este ejemplo de código se establece la visibilidad del lienzo en contraída y, a continuación, se establece la propiedad IsOpen de la ventana emergente en falso para que ambos estén ocultos. Cuando el usuario hace clic en otro lugar dentro de la aplicación, se oculta el elemento emergente.

Figura 14. Visibilidad emergente al hacer clic con el botón secundario

Visibilidad emergente al hacer clic con el botón secundario

Habilitar operaciones de Portapapeles en Silverlight 4

El acceso al Portapapeles es una novedad de Silverlight 4. Para obtener acceso al Portapapeles en Silverlight 4 se usan los métodos estáticos del objeto Clipboard. La compatibilidad del Portapapeles es de solo texto. Use los métodos GetText y SetText para obtener o establecer el texto. Esto es especialmente útil para permitir al usuario copiar texto fijo. En el escenario, se agrega compatibilidad con Portapapeles para una lista de incidentes con el código indicado a continuación.

            Clipboard.SetText(incident.Customer + " - " +
                incident.Agent + " - " + 
                incident.Status);

Tenga en cuenta que cuando Silverlight 4 intenta obtener acceso al Portapapeles mediante el uso del objeto Clipboard, el usuario recibe un aviso para permitir el acceso al Portapapeles. Se trata de un aviso de seguridad para evitar el uso malintencionado del Portapapeles.

Crear elementos web de Silverlight en SharePoint Foundation 2010

Ahora tenemos una aplicación de Silverlight 4 rica en contenido y visualmente atractiva que extrae datos de una lista de SharePoint mediante el modelo de objetos de cliente administrado. El último paso es implementarlo en el sitio de SharePoint. Para ello, use el elemento web Silverlight predeterminado. Antes, para la implementación de aplicaciones de Silverlight en sitios de SharePoint era necesario escribir y mantener los elementos web personalizados que consumían las aplicaciones de Silverlight. El elemento web de Silverlight incluido en SharePoint Foundation 2010 reduce en gran medida la cantidad de código personalizado asociado con la implementación de aplicaciones de Silverlight en sitios de SharePoint.

Debe hospedar el archivo .xap de Silverlight en una ubicación a la que pueda tener acceso el equipo servidor que ejecuta SharePoint 2010. En este escenario, el archivo se almacena en una biblioteca de documentos. El siguiente procedimiento le guiará a través del proceso.

Para implementar la aplicación de Silverlight en un sitio de SharePoint 2010

  1. Navegue al sitio de SharePoint en el que desea hospedar la aplicación de Silverlight.

  2. Haga clic en Acciones del sitio. En la lista, haga clic en Más opciones.

  3. En la ventana Crear, en Página, haga clic en Nueva página de elementos web.

  4. Después de crear la página, en la página, donde desee agregar el elemento web de Silverlight, haga clic en Agregar un elemento web, tal como se muestra en la figura siguiente.

    Figura 15. Adición de un elemento web a la página Elementos web de SharePoint

    Adición de un elemento web

  5. En Categorías, haga clic en la categoría Medios y contenido y, a continuación, haga clic en Elemento web de Silverlight.

  6. En la lista Agregar elemento web a, elija la ubicación en la página y, a continuación, haga clic en Agregar, tal como se muestra en la figura siguiente.

    Figura 16. Adición de un elemento web

    Adición de un elemento web

  7. En el diálogo, escriba la ruta de acceso al archivo .xap de Silverlight y, a continuación, haga clic en Aceptar.

    Figura 17. Escritura de la ruta de acceso al archivo .xap de Silverlight

    Escritura de la ruta de acceso

    Después de agregar el elemento web de Silverlight, edite las propiedades según sus necesidades.

  8. Haga clic en la flecha abajo en el título del elemento web de Silverlight y seleccione Editar elemento web para abrir el panel de propiedades, como se muestra en la figura siguiente.

    Figura 18. Edición del elemento web de Silverlight en la página Elementos web de SharePoint

    Edición del elemento web de Silverlight

  9. Modifique las propiedades según sea necesario y, a continuación, presione Aceptar.

    Figura 19. Configuración de las propiedades del elemento web de Silverlight

    Configuración de las propiedades del elemento web de Silverlight

La aplicación de Silverlight debería aparecer en la página Elementos web de SharePoint, como se muestra en la figura siguiente.

Figura 20. Aplicación de Silverlight en un elemento web de la página Elementos web de SharePoint

Aplicación de Silverlight en un elemento web

Conclusión

En este artículo se muestra el valor del modelo de objetos de cliente administrado de SharePoint Foundation 2010 para agregar una amplia flexibilidad y características. El modelo de objetos de cliente administrado simplifica el consumo de datos de SharePoint y el trabajo con las características de SharePoint. Combinado con la eficacia de Silverlight 4 y su capacidad para ofrecer interfaces enriquecidas y experiencias de usuario dinámicas, ofrece enormes posibilidades para maximizar las características de SharePoint y Silverlight juntos. En resumen, en este artículo se proporciona un modelo para el uso del modelo de objetos de cliente administrado mediante ejemplos de cómo crear, agregar y editar elementos de listas de SharePoint. A continuación, se describe cómo usar las características presentadas en Silverlight 4: impresión, compatibilidad con clic con el botón secundario y acceso al Portapapeles. Por último, se describe cómo implementar las aplicaciones de Silverlight usando el nuevo elemento web de Silverlight en SharePoint Foundation 2010. Estas adiciones representan nuevas e importantes oportunidades para el uso de SharePoint Foundation 2010 de formas nuevas y más flexibles, sin la sobrecarga que solía afectar al desarrollo de aplicaciones cliente para productos y tecnologías de SharePoint.

Recursos adicionales

Acerca del autor

Casey Margell lleva casi una década desarrollando software personalizado con una gran variedad de tecnologías. Últimamente, ha comenzado a centrar su atención en Silverlight y SharePoint y en la integración de diversas tecnologías y sistemas. Casey posee un título de licenciado en informática y sistemas de software de la Universidad de Washington, Campus Bothell.