Compartir a través de


Tutorial: Depurar una aplicación de SharePoint mediante IntelliTrace

Mediante IntelliTrace, puede depurar las aplicaciones más fácilmente, incluidas las que incorporan páginas web, como, por ejemplo, las soluciones de SharePoint. Los depuradores tradicionales solo proporcionan una instantánea del estado de la aplicación en el momento actual. Sin embargo, puede usar IntelliTrace para revisar los eventos pasados que se produjeron en la aplicación y el contexto en los que los eventos se produjeron, e incluso navegar a ellos.

Este tutorial muestra cómo usar IntelliTrace para depurar un proyecto de SharePoint en Visual Studio 2010. Este proyecto incorpora un receptor de características que, cuando se activa la característica, agrega una tarea a la lista de tareas y un anuncio a la lista de anuncios. Cuando la característica está desactivada, la tarea se marca como completada y se agrega un segundo anuncio a la lista de anuncios. Sin embargo, el procedimiento contiene un error lógico que evita que el proyecto se ejecute correctamente. Mediante IntelliTrace, se puede localizar y corregir el error.

En este tutorial se muestran las tareas siguientes:

  • Crear una característica y un receptor de eventos de característica.

  • Responder a los eventos de característica mediante el código.

  • Hacer referencia a las listas Tarea y Anuncio mediante el código.

  • Buscar y manipular los elementos de lista mediante el código.

  • Usar IntelliTrace para localizar y corregir un error del código.

  • Nota

    Es posible que, para algunos de los elementos de la interfaz de usuario, el equipo muestre nombres o ubicaciones diferentes de los que aparecen en las instrucciones de este tema. Estos elementos varían dependiendo de la configuración y de la edición de Visual Studio. Para obtener más información, vea Trabajar con valores de configuración.

Requisitos previos

Necesita los componentes siguientes para completar este tutorial:

Crear un receptor de características

Primero, debe crear un proyecto de SharePoint vacío con un receptor de características.

Para crear un receptor de características

  1. Inicie Visual Studio con la opción Ejecutar como administrador.

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

    Aparecerá el cuadro de diálogo Nuevo proyecto.

  3. En la parte superior del cuadro de diálogo, haga clic en .NET Framework 3.5 en la lista si aún no está seleccionado.

  4. Bajo el lenguaje que desea usar, expanda el nodo SharePoint y, a continuación, haga clic en el nodo 2010.

  5. En el recuadro Plantillas, haga clic en Proyecto de SharePoint vacío, cambie el nombre del proyecto a IntelliTraceTest y, a continuación, haga clic en Aceptar.

    Aparece el Asistente para la personalización de SharePoint, en el que puede especificar el sitio de SharePoint para el proyecto y el nivel de confianza de la solución.

  6. Haga clic en Implementar como solución de granja de servidores y, a continuación, haga clic en Finalizar.

    IntelliTrace sólo funciona en soluciones de granja.

  7. Haga clic con el botón secundario en el nodo Características en el Explorador de soluciones y, a continuación, haga clic en Agregar característica.

    Aparece Feature1.feature.

  8. Haga clic con el botón secundario en Feature1.feature y, a continuación, haga clic en Agregar receptor de eventos para agregar un módulo de código a la característica.

Agregar código al receptor de características

Luego, agregue el código a dos métodos del receptor de características: FeatureActivated y FeatureDeactivating. Estos métodos se activan cada vez que una característica se activa o se desactiva en SharePoint, respectivamente.

Para agregar código al receptor de características

  1. En la parte superior de la clase Feature1.EventReceiver, agregue el siguiente código para declarar las variables que especifican el sitio y subsitio de SharePoint:

    ' SharePoint site/subsite.
    Private siteUrl As String = "https://localhost"
    Private webUrl As String = "/"
    
    // SharePoint site/subsite.
    private string siteUrl = "https://localhost";
    private string webUrl = "/";
    
  2. Reemplace el método FeatureActivated con el código siguiente:

    Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties)
        Try
            Using site As New SPSite(siteUrl)
                Using web As SPWeb = site.OpenWeb(webUrl)
                    ' Reference the lists.
                    Dim announcementsList As SPList = web.Lists("Announcements")
                    Dim taskList As SPList = web.Lists("Tasks")
    
                    ' Add a new announcement to the Announcements list.
                    Dim listItem As SPListItem = announcementsList.Items.Add()
                    listItem("Title") = "Activated Feature: " & Convert.ToString(properties.Definition.DisplayName)
                    listItem("Body") = Convert.ToString(properties.Definition.DisplayName) & " was activated on: " & DateTime.Now.ToString()
                    listItem.Update()
    
                    ' Add a to-do task to the Task list.
                    Dim newTask As SPListItem = taskList.Items.Add()
                    newTask("Title") = "Deactivate feature: " & Convert.ToString(properties.Definition.DisplayName)
                    newTask.Update()
                End Using
            End Using
    
        Catch e As Exception
            Console.WriteLine("Error: " & e.ToString())
        End Try
    
    End Sub
    
    public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {
        try
        {
            using (SPSite site = new SPSite(siteUrl))
            {
                using (SPWeb web = site.OpenWeb(webUrl))
                {
                    // Reference the lists.
                    SPList announcementsList = web.Lists["Announcements"];
                    SPList taskList = web.Lists["Tasks"];
    
                    // Add a new announcement to the Announcements list.
                    SPListItem listItem = announcementsList.Items.Add();
                    listItem["Title"] = "Activated Feature: " + properties.Definition.DisplayName;
                    listItem["Body"] = properties.Definition.DisplayName + " was activated on: " + DateTime.Now.ToString();
                    listItem.Update();
    
                    // Add a to-do task to the Task list.
                    SPListItem newTask = taskList.Items.Add();
                    newTask["Title"] = "Deactivate feature: " + properties.Definition.DisplayName;
                    newTask.Update();
                }
            }
        }
    
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.ToString());
        }
    
    }
    
  3. Reemplace el método FeatureDeactivating con el código siguiente:

    Public Overrides Sub FeatureDeactivating(ByVal properties As SPFeatureReceiverProperties)
        Try
            Using site As New SPSite(siteUrl)
                Using web As SPWeb = site.OpenWeb(webUrl)
                    ' Reference the lists
                    Dim taskList As SPList = web.Lists("Tasks")
                    Dim announcementsList As SPList = web.Lists("Announcements")
    
                    ' Add an announcement that the feature was deactivated.
                    Dim listItem As SPListItem = announcementsList.Items.Add()
                    listItem("Title") = "Deactivated Feature: " & Convert.ToString(properties.Definition.DisplayName)
                    listItem("Body") = Convert.ToString(properties.Definition.DisplayName) & " was deactivated on: " & DateTime.Now.ToString()
                    listItem.Update()
    
                    ' Find the task the feature receiver added to the Task list when the
                    ' feature was activated.
                    Dim qry As New SPQuery()
                    qry.Query = "<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>Deactive</Value></Contains></Where>"
                    Dim taskItems As SPListItemCollection = taskList.GetItems(qry)
    
                    For Each taskItem As SPListItem In taskItems
                        ' Mark the task as complete.
                        taskItem("PercentComplete") = 1
                        taskItem("Status") = "Completed"
                        taskItem.Update()
                    Next
                End Using
    
            End Using
    
        Catch e As Exception
            Console.WriteLine("Error: " & e.ToString())
        End Try
    
    End Sub
    
    public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
    {
        try
        {
            using (SPSite site = new SPSite(siteUrl))
            {
                using (SPWeb web = site.OpenWeb(webUrl))
                {
                    // Reference the lists
                    SPList taskList = web.Lists["Tasks"];
                    SPList announcementsList = web.Lists["Announcements"];
    
                    // Add an announcement that the feature was deactivated.
                    SPListItem listItem = announcementsList.Items.Add();
                    listItem["Title"] = "Deactivated Feature: " + properties.Definition.DisplayName;
                    listItem["Body"] = properties.Definition.DisplayName + " was deactivated on: " + DateTime.Now.ToString();
                    listItem.Update();
    
                    // Find the task the feature receiver added to the Task list when the
                    // feature was activated.
                    SPQuery qry = new SPQuery();
                    qry.Query = "<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>Deactive</Value></Contains></Where>";
                    SPListItemCollection taskItems = taskList.GetItems(qry);
    
                    foreach (SPListItem taskItem in taskItems)
                    {
                        // Mark the task as complete.
                        taskItem["PercentComplete"] = 1;
                        taskItem["Status"] = "Completed";
                        taskItem.Update();
                    }
                }
            }
    
        }
    
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.ToString());
        }
    }
    

Probar el proyecto

Ahora que el código se ha agregado al receptor de características, ejecute la aplicación de SharePoint para probar si funciona correctamente. En este ejemplo, se ha incluido en el código un pequeño error. Después de que se produzca el error, use IntelliTrace para encontrar el problema.

Para probar el proyecto

  1. Presione F5 para ejecutar el proyecto.

    En la implementación, la característica se activa automáticamente, lo que hace que el receptor de características agregue un anuncio y una tarea.

  2. Una vez iniciado SharePoint, haga clic en Listas en el panel de navegación y, a continuación, haga clic en la lista de anuncios y en la lista de tareas para ver su contenido.

    Se ha agregado un nuevo anuncio denominado Característica activada: IntelliTraceTest_Feature1 a la lista de anuncios y una nueva tarea denominada Desactivar característica: IntelliTraceTest_Feature1 a la lista de tareas. El estado de la tarea es "Sin iniciar".

  3. Para desactivar la característica, haga clic en Administrar las características del sitio en Acciones del sitio, haga clic en Desactivar al lado de IntelliTraceTest Feature1 y, a continuación, haga clic en el vínculo Desactivar esta característica en la página Advertencia.

    El valor de Estado de la tarea debería ser ahora "Completada" y su valor % completado debería ser "100%". Por el contrario, los valores todavía tienen su configuración predeterminada. Un error en el código evita que la tarea se actualice.

Depurar el proyecto

Use IntelliTrace para buscar y corregir el problema en el código.

Para depurar el proyecto

  1. En el método FeatureDeactivating, busque la línea SPQuery qry = new SPQuery(); y presione F9 para insertar un punto de interrupción en esa línea.

    Dado que el problema se produce cuando la característica está desactivada, esta línea es un lugar lógico para iniciar la depuración.

  2. Presione F5 para ejecutar el programa de nuevo y active y, a continuación, desactive la característica y repita los pasos indicados en "Para probar el proyecto", anteriormente en este tema.

    Cuando se alcanza el punto de interrupción en FeatureActivated, aparece la ventana IntelliTrace, que hace una lista de los pasos que la aplicación ha realizado hasta ahora.

  3. Presione F11 para reproducir paso a paso cada línea de código hasta que el programa se complete.

    Cada vez que presiona F11, se agrega otra línea "Depurador" al historial de depuración de IntelliTrace de la aplicación.

  4. Una vez completado el programa, haga clic en el vínculo Interrumpir todos en la ventana IntelliTrace.

    Debe realizar este paso para guardar los datos de IntelliTrace.

    Opcionalmente, para ver la información de llamadas de la aplicación, haga clic en Abrir configuración de IntelliTrace en la barra de herramientas de IntelliTrace y, a continuación, haga clic en Información de llamadas y eventos de IntelliTrace.

  5. Guarde los datos de depuración haciendo clic en Guardar la sesión actual de IntelliTrace en la barra de herramientas de IntelliTrace.

    El archivo tendrá una extensión .iTrace.

  6. En Visual Studio, haga clic en Detener depuración.

  7. Abra el archivo .iTrace.

    Este paso abre otra instancia de Visual Studio que muestra la página Resumen de IntelliTrace, que proporciona información de depuración como los datos de excepciones y una lista de subprocesos que se usan en el programa.

  8. Expanda la Lista de subprocesos, haga clic en Subproceso principal y, a continuación, haga clic en Iniciar depuración.

    Este paso inicia una sesión de depuración en Visual Studio que usa los datos de .iTrace. Para ver los detalles adicionales sobre un evento en la ventana IntelliTrace, haga clic en él.

  9. Dado que sospechamos que el error se produce en el método FeatureDeactivating, haga clic en el vínculo Variables locales en el paso Depurador: correspondiente a SPListItemCollection taskItems = taskList.GetItems(qry);.

    Aparece la ventana Variables locales.

  10. En la ventana Variables locales, expanda la lista de variables, busque qry.Query y compruebe que la consulta para buscar la tarea busca incorrectamente "Deactive" en lugar de "Deactivate".

    Este error significa que la tarea nunca se encuentra en la consulta de la lista de tareas.

Volver a probar el proyecto

Ahora que ha identificado el problema con IntelliTrace, corrija el error y, a continuación, vuelva a probar el proyecto.

Para volver a probar el proyecto

  1. Cierre la sesión de depuración de Visual Studio y, a continuación, vuelva a abrir el proyecto IntelliTraceTest si no está ya abierto.

  2. En la cadena de consulta del código (qry.Query = "<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>Deactive</Value></Contains></Where>"), cambie el valor de Deactive a Deactivate.

  3. Presione F5 para ejecutar de nuevo el proyecto.

  4. Abra la lista de tareas y compruebe que el valor Estado de la tarea Deactivate está establecido ahora correctamente como "Completada" y el valor % completado es 100%.

Vea también

Conceptos

Depurar con IntelliTrace

Otros recursos

Comprobar y depurar código de SharePoint usando características de ALM

Tutorial: Comprobar código de SharePoint mediante pruebas unitarias