Compartir a través de


Opciones de almacenamiento de datos en SharePoint Online

En este artículo se describe la aplicación de ejemplo Core.DataStorageModels, que muestra cada una de las siguientes opciones de almacenamiento de datos y las ventajas y desventajas de cada una:

  • Lista de SharePoint en la web de complemento
  • Lista de SharePoint en la web de host
  • Servicio web externo
  • Almacenamiento de tablas de Azure
  • Azure Queue Storage
  • Base de datos SQL de Azure

La aplicación de ejemplo Core.DataStorageModels es un complemento hospedado por el proveedor escrito en C# y JavaScript que implementa una serie de artefactos de SharePoint (listas, elemento de complemento, elemento web) tanto en la web de host como en la web de complemento. Interactúa con listas de SharePoint en la web de complemento y en la web de host, y también realiza llamadas a Azure SQL Database, Azure Queue Storage y Azure Table Storage, y a un servicio web remoto que implementa OData. En este ejemplo se usa el patrón Model-View-Controller.

La aplicación de ejemplo Core.DataStorageModels aplica cada opción de almacenamiento de datos a una función específica para la que la opción es adecuada, como se describe en la tabla siguiente.

Opción de almacenamiento de la aplicación de ejemplo Usado para
Web de complemento de lista de SharePoint Notas del cliente
Web de host de lista de SharePoint Casos de soporte técnico
Llamar al servicio web de Northwind OData Clientes
Almacenamiento de tablas de Azure Clasificaciones CSR
Azure Queue Storage Cola de llamadas
Azure SQL base de datos Northwind Pedidos, detalles del pedido, productos

La aplicación de ejemplo implementa un panel de servicio al cliente y las interfaces relacionadas que muestran pedidos recientes, clasificaciones de encuestas de representantes de clientes, notas del cliente, casos de soporte técnico y una cola de llamadas de representantes de clientes.

Los dos primeros escenarios permiten recuperar datos mediante el uso de código de modelo de objetos de cliente relativamente simple o consultas REST, pero están limitados por umbrales de consulta de lista. Los cuatro escenarios siguientes usan diferentes tipos de almacenamiento remoto.

Página de inicio de modelos de almacenamiento de datos en la que se le pide que implemente componentes de SharePoint

Captura de pantalla de la IU de la aplicación de ejemplo

Antes de empezar

Antes de usar este ejemplo, asegúrese de que tiene lo siguiente:

  • Una cuenta de Microsoft Azure en la que puede implementar un Azure SQL Database y crear una cuenta de Azure Storage.

  • Un sitio para desarrolladores de SharePoint para que pueda implementar el ejemplo desde Visual Studio.

Además, debe implementar la base de datos Northwind en Microsoft Azure.

Para implementar la base de datos Northwind

  1. Inicie sesión en el Azure Portal y elija servidoresde Base de Datos SQL>.

  2. Elija Crear un servidor de Base de Datos SQL.

  3. En el formulario Crear servidor, escriba los valores para nombre de inicio de sesión, contraseña de inicio de sesión y región.

    Muestra la configuración de servidor de la base de datos SQL

  4. Active la casilla para finalizar y crear el servidor.

  5. Ahora que ha creado la base de datos, elija el nombre del servidor que ha creado.

    Muestra la lista de bases de datos SQL

  6. Elija CONFIGURAR, elija la flecha de la esquina inferior derecha para completar la configuración y, a continuación, elija GUARDAR.

  7. Abra SQL Server Management Studio en el equipo de desarrollo local y cree una nueva base de datos denominada NorthWind.

  8. En el Explorador de objetos, seleccione la base de datos deNorthwind y, a continuación, elija nueva consulta.

  9. En un editor de texto de su elección, abra el script SQL northwind.sql que se proporciona con el ejemplo Core.DataStorageModels .

  10. Copie el texto del archivo northwind.sql, péguelo en la ventana Consulta SQL en SQL Server Management Studio y, a continuación, elija Ejecutar.

  11. En el Explorador de objetos, abra el menú contextual de la base de datos de Northwind (haga clic con el botón derecho en ella), seleccione Tasksy, a continuación, seleccione Deploy Database to SQL Azure(Implementar base de datos en SQL Azure.

  12. En la pantalla Introducción, elija Siguiente.

  13. Elija Conectary, a continuación, escriba el nombre del servidor para el servidor de Azure SQL Database que acaba de crear.

  14. En la lista de autenticación seleccione Autenticación de Microsoft SQL Server.

  15. Escriba el nombre de usuario y la contraseña que usó al crear el servidor de Azure SQL Database y, a continuación, elija Conectar.

  16. Elija siguientey, a continuación, elija Finalizary espere hasta que se cree la base de datos. Una vez creado, elija Cerrar para cerrar el asistente.

  17. Vuelva al Azure Portal para comprobar que la base de datos Northwind se creó correctamente. Debería verlo listado en la pantalla de bases de datos SQL.

    Muestra una lista de todas las bases de datos SQL, incluida Northwind

  18. Seleccione la base de datos Northwind y, a continuación, seleccione Ver SQL Database cadenas de conexión.

  19. Copie la cadena de conexión, péguela en un archivo de texto y guárdela localmente. Necesitará esta cadena de conexión más adelante. Cierre el cuadro de diálogo Cadenas de conexión.

  20. Elija el Configure las reglas de firewall de Windows Azure para esta dirección IP vínculo y agregue la dirección IP a las reglas de firewall para permitirle acceder a la base de datos.

  21. Abra el proyecto Core.DataStorageModels.sln en Visual Studio.

  22. En el Visual Studio Explorador de soluciones, busque el archivo Web.config.

  23. En el archivo Web.config, busque el elemento add name="NorthWindEntities" y reemplace el valor existenteconnectionString por la información de la cadena de conexión que guardó localmente en el paso 19.

      <add name="NorthWindEntities" 
      connectionString="metadata=res://*/Northwind.csdl|res://*/Northwind.ssdl|res://*/Northwind.msl;provider=System.Data.SqlClient;provider connection string=&amp;quot;data source=<Your Server Here>.database.windows.net;initial catalog=NorthWind;user id=<Your Username Here>@<Your Server Here>;password=<Your Password Here>;MultipleActiveResultSets=True;App=EntityFramework&amp;quot;"
      providerName="System.Data.EntityClient" />
    

  24. Guarde el archivo Web.config.

Lista de SharePoint en la web de complementos (escenario de notas)

El escenario Notas, que usa una lista de SharePoint en una web de complemento, muestra cómo funcionan las listas en una web de complemento de SharePoint. La lista de Notas se crea en la web del complemento con un campo de título y descripción. La API de REST de SharePoint consulta la lista de notas y devuelve todas las notas en función de un identificador de cliente.

El uso de listas en la web de complementos tiene una ventaja importante con respecto a otras soluciones de almacenamiento: puede usar sencillas llamadas a la API de REST de SharePoint para consultar datos.

Sin embargo, hay algunas desventajas:

  • Para actualizar los metadatos de la lista, debe actualizar y volver a implementar el complemento.
  • Para actualizar la estructura de datos, debe reescribir la lógica de la aplicación para almacenar y actualizar los datos.
  • La información almacenada en la lista no se puede compartir fácilmente con otros complementos.
  • No puede buscar datos en SharePoint.
  • La cantidad de datos que puede almacenar en listas y el tamaño de los conjuntos de resultados de la consulta son limitados.

El código subyacente a la sección Notas del panel del cliente usa consultas REST para recuperar datos de una lista que se implementa en la web del complemento. Esta lista contiene campos para títulos, autores, identificadores de clientes y descripciones. Puede usar la interfaz del complemento para agregar y recuperar notas para un cliente especificado, como se muestra en la ilustración siguiente.

Interfaz de usuario para el complemento Notes

Una captura de pantalla que muestra la IU del modelo de almacenamiento de datos de notas

El vínculo Ver lista de notas en App Web proporciona una vista lista para usar de los datos de lista.

Este complemento usa el patrón Model-View-Controller. Puede ver el código del escenario notes en el archivo Views/CustomerDashboard/Notes.cshtml. Usa llamadas REST sencillas para agregar y recuperar datos.

El código siguiente recupera notas de la lista notas de un cliente especificado.

function getNotesAndShow() {
    var executor = new SP.RequestExecutor(appWebUrl);
    executor.executeAsync(
       {
           url: appWebUrl + "/_api/web/lists/getByTitle('Notes')/items/" +
                "?$select=FTCAM_Description,Modified,Title,Author/ID,Author/Title" +
                "&amp;$expand=Author/ID,Author/Title" +
                "&amp;$filter=(Title eq '" + customerID + "')",
           type: "GET",
           dataType: 'json',
           headers: { "accept": "application/json;odata=verbose" },
           success: function (data) {
               var value = JSON.parse(data.body);
               showNotes(value.d.results);
           },
           error: function (error) { console.log(JSON.stringify(error)) }
       }

    );
}

El código siguiente agrega una nota para un cliente determinado a la lista de notas.

function addNoteToList(note, customerID) {
    var executor = new SP.RequestExecutor(appWebUrl);
    var bodyProps = {
        '__metadata': { 'type': 'SP.Data.NotesListItem' },
        'Title': customerID,
        'FTCAM_Description': note
    };
    executor.executeAsync({
        url: appWebUrl + "/_api/SP.AppContextSite(@target)/web/lists/getbytitle('Notes')/items?@target='" + appWebUrl + "'",
        contentType: "application/json;odata=verbose",
        method: "POST",
        headers: {
            "accept": "application/json;odata=verbose",
            "content-type": "application/json;odata=verbose",
            "X-RequestDigest": $("#__REQUESTDIGEST").val()
        },
        body: JSON.stringify(bodyProps),
        success: getNotesAndShow,
        error: addNoteFailed
    });
}

Puede agregar 5000 elementos a la lista para mostrar que las consultas de lista que generan un conjunto de resultados de 5000 o más elementos alcanzan el umbral de consulta de lista y producen errores. También puede agregar tantos datos a la lista en la web del complemento que supere el límite de almacenamiento de la colección de sitios (que depende de la cantidad de espacio de almacenamiento que le haya asignado).

Estos escenarios muestran dos de las limitaciones más importantes de este enfoque: enumerar los límites de tamaño de consulta y los límites de espacio de almacenamiento. Si sus necesidades empresariales requieren que trabaje con conjuntos de datos grandes y conjuntos de resultados de consultas, este enfoque no funcionará.

Umbral de consulta de lista

Para cargar suficientes datos para superar el límite de umbral de consulta de lista:

  1. En el menú de la izquierda, elija página principal de ejemplo.

  2. En la sección Umbrales de consulta de lista, elija Agregar elementos de lista a la lista Notas en laweb del complemento.

  3. Según las instrucciones que aparecen encima del botón, realice esta operación 10 veces.

    Cuando se actualiza la lista de notas, aparece un mensaje en la parte superior de la página que indica cuántos elementos de lista (Notas) ha agregado y cuántos quedan por agregar.

    Nota:

    La operación tarda aproximadamente un minuto en ejecutarse cada vez que se elige el botón. El resultado final de la ejecución de la operación 10 veces se muestra en la ilustración siguiente.

  4. Después de agregar 5001 elementos a la lista, elija Notas en el menú de la izquierda. Cuando se carga la página, verá el mensaje de error que se muestra en la ilustración siguiente, que procede de la API de REST de SharePoint.

    Captura de pantalla que muestra un mensaje de error que indica que la operación ha superado el umbral de la vista de lista.

  5. Elija Ver lista de notas en App Web y recorra la lista para ver que incluye 500 filas. Tenga en cuenta que, aunque las vistas de lista de SharePoint pueden acomodar la exploración de tantas entradas, la API REST falla debido al umbral de limitación de consultas de lista.

Límite de almacenamiento de datos

Para cargar suficientes datos para superar el límite de almacenamiento de datos:

  1. En el menú de la izquierda, elija página principal de ejemplo.

  2. En la sección Umbral de datos, elija Rellenar la lista de notas web de la aplicación con 1 GB de datos.

  3. Según las instrucciones que aparecen encima de la Rellene la lista de notas web de la aplicación con 1 GB de datos botón, realice esta operación 11 veces.

    Cuando se actualiza la lista de notas, aparece un mensaje en la parte superior de la página que indica cuántos elementos de lista (Notas) ha agregado y cuántos quedan por agregar.

    Nota:

    La operación tarda aproximadamente un minuto en ejecutarse cada vez que se elige el botón. El resultado final de ejecutar la operación 11 veces se muestra en la ilustración siguiente.

  4. Después de realizar la operación 11 veces, se produce un mensaje de error al elegir el botón, como se muestra en la ilustración siguiente.

    Captura de pantalla que muestra el mensaje de error que se produce cuando se supera el límite de almacenamiento de datos

  5. Después de superar el límite de almacenamiento de datos, elija el botón Atrás en el explorador web y, a continuación, elija el vínculo Notas en el menú de la izquierda.

  6. Elija Ver lista de notas en web de aplicación.

    Cuando se carga la página, aparece un mensaje de error en la parte superior de la página que indica que el sitio no tiene espacio de almacenamiento.

Lista de SharePoint en la web de host (escenario de casos de soporte técnico)

El escenario casos de soporte técnico muestra los datos que se almacenan en una lista de SharePoint en la web de host. En este escenario se usan dos patrones diferentes para acceder a los datos e interactuar con ellos. El primer patrón incluye el servicio de búsqueda de SharePoint y el elemento web De contenido por búsqueda con una plantilla de presentación personalizada aplicada. El segundo patrón incluye un elemento de aplicación (elemento web cliente) que muestra una vista Modelo-Vista-Controlador, que usa la SP. RequestExecutor clase para llamar a la API rest de SharePoint.

El uso de este enfoque tiene varias ventajas:

  • Puede consultar datos fácilmente mediante consultas REST simples o código de modelo de objetos de cliente.
  • Puede buscar datos en SharePoint.
  • Puede actualizar los metadatos de la lista y crear nuevas vistas para una lista sin actualizar ni volver a implementar el complemento. Estos cambios no afectarán al comportamiento del complemento.
  • Las listas de la web de host no se eliminan al desinstalar el complemento, a menos que el complemento use el evento AppUninstalled para quitar la lista o eliminar los datos.

El desplazamiento de estas ventajas son las siguientes desventajas:

  • La web de host limita la cantidad de datos que puede almacenar en listas y el tamaño de los resultados de la consulta. Si las necesidades de su empresa requieren almacenar o consultar grandes conjuntos de datos, este no es un enfoque recomendado.
  • En el caso de las consultas complejas, las listas no funcionan tan bien como las bases de datos.
  • Para realizar copias de seguridad y restaurar datos, las listas no funcionan tan bien como las bases de datos.

Los datos de este escenario se almacenan en una lista de SharePoint implementada en la web de host. Los datos se recuperan y se muestran mediante lo siguiente:

El código de esta vista usa consultas REST para recuperar información de la lista, mientras que el elemento web búsqueda de contenido usa el servicio de búsqueda de SharePoint para recuperar los datos. Los dos enfoques muestran la ventaja significativa de esta opción: puede usar el servicio de búsqueda y las API rest/CSOM para recuperar información de una lista en la web de host.

Al seleccionar un cliente de la lista de casos de soporte técnico, verá que los datos de casos de soporte técnico de ese cliente se muestran tanto en el elemento web como en el elemento de aplicación. Es posible que el elemento web no devuelva contenido inmediatamente, ya que el servicio de búsqueda de SharePoint puede tardar hasta 24 horas en indexar los datos. También puede elegir el vínculo Ver lista de casos de soporte técnico en host web para ver una vista convencional de los datos de la lista.

Interfaz de usuario para el escenario de casos de soporte técnico

Captura de pantalla que muestra la IU para interactuar con el escenario de caso de soporte técnico


El elemento web búsqueda de contenido implementado por este complemento usa una plantilla de presentación personalizada. En la ilustración siguiente se muestra dónde puede encontrar el elemento web y la plantilla asociada en el directorio Activos del proyecto web.

Contenido del directorio Assets del proyecto web

Captura de pantalla del directorio de activos


El siguiente código JavaScript que encontrará en el archivo Views/SupportCaseAppPart/Index.cshtml usa la biblioteca entre dominios para invocar una consulta REST en la lista de SharePoint en la web de host.

function execCrossDomainRequest() {
var executor = new SP.RequestExecutor(appWebUrl);

executor.executeAsync(
   {
        url: appWebUrl + "/_api/SP.AppContextSite(@@target)" +
                "/web/lists/getbytitle('Support Cases')/items" +
              "?$filter=(FTCAM_CustomerID eq '" + customerID + "')" +
            "&amp;$top=30" +
                    "&amp;$select=Id,Title,FTCAM_Status,FTCAM_CSR" +
                    "&amp;@@target='" + hostWebUrl + "'",
method: "GET",
              headers: { "Accept": "application/json; odata=verbose" },
              success: successHandler,
              error: errorHandler
   }
);
}

Puede agregar 5000 elementos a la lista para mostrar que las consultas de lista que generan un conjunto de resultados de 5000 o más elementos alcanzan el umbral de consulta de lista y producen errores. Este escenario muestra una de las limitaciones más importantes de este enfoque: enumerar los límites de tamaño de consulta. Si sus necesidades empresariales requieren que trabaje con conjuntos de resultados de consultas y datos de gran tamaño, este enfoque no funcionará. Para obtener más información, vea List query threshold anteriormente en este artículo.

Servicio web OData de Northwind (escenario del panel de clientes)

El escenario panel de clientes usa AJAX de JQuery para invocar el servicio OData de NorthWind para devolver información del cliente. El complemento almacena sus datos en un servicio web y, a continuación, usa OData para recuperarlos.

Estas son las ventajas de usar este enfoque:

  • Un servicio web determinado puede admitir varios complementos.
  • Puede actualizar el servicio web sin tener que actualizar y volver a implementar los complementos.
  • Las instalaciones de SharePoint y del servicio web no se afectan entre sí.
  • Los servicios de hospedaje, como Microsoft Azure permiten escalar los servicios web.
  • Puede hacer una copia de seguridad y restaurar la información de los servicios web independientemente del sitio de SharePoint.
  • No se pierden datos al desinstalar el complemento, a menos que el complemento use el evento deAppUninstalled para eliminar los datos.

El escenario panel de cliente almacena sus datos en un servicio web que implementa el estándar OData para recuperar datos. En la interfaz del panel del cliente, selecciona un cliente en un menú desplegable y la información del cliente se muestra en el panel Información del cliente.

Esta página de la interfaz de usuario es una vista Modelo-Vista-Controlador. La presentación se define en el archivo Views/CustomerDashboard/Home.cshtml. El código subyacente está en el archivo Scripts/CustomerDashboard.js. El código JavaScript usa AJAX para consultar el servicio web Northwind. Dado que se trata de un servicio OData, la consulta del servicio web consta de argumentos de cadena de consulta adjuntos a una dirección URL que apunta a un punto de conexión de servicio web. El servicio devuelve información del cliente en formato JSON.

El código siguiente se ejecuta al elegir el vínculo Panel del cliente. Recupera todos los nombres de cliente y los identificadores para rellenar el menú desplegable.

var getCustomerIDsUrl = "https://odatasampleservices.azurewebsites.net/V3/Northwind/Northwind.svc/Customers?$format=json&amp;$select=CustomerID";
    $.get(getCustomerIDsUrl).done(getCustomerIDsDone)
        .error(function (jqXHR, textStatus, errorThrown) {
            $('#topErrorMessage').text('Can\'t get customers. An error occurred: ' + jqXHR.statusText);
        });

El código siguiente se ejecuta al seleccionar un nombre de cliente en el menú desplegable. Usa el argumento OData $filter para especificar el identificador de cliente y otros argumentos de cadena de consulta para recuperar información relacionada con este cliente.

var url = "https://odatasampleservices.azurewebsites.net/V3/Northwind/Northwind.svc/Customers?$format=json" +  "&amp;$select=CustomerID,CompanyName,ContactName,ContactTitle,Address,City,Country,Phone,Fax" + "&amp;$filter=CustomerID eq '" + customerID + "'";

$.get(url).done(getCustomersDone)
   .error(function (jqXHR, textStatus, errorThrown) {
          alert('Can\'t get customer ' + customerID + '. An error occurred: ' + 
                 jqXHR.statusText);
});

Azure Table Storage (escenario de encuesta de servicio al cliente)

El escenario de encuesta de servicio al cliente permite a un representante del servicio de atención al cliente ver su clasificación en función de las encuestas de los clientes y usa Azure Table Storage y la API de Microsoft.WindowsAzure.Storage.Table.CloudTable api para almacenar los datos e interactuar con ellos.

Estas son las ventajas de usar este enfoque:

  • Azure Table Storage admite más de un complemento.
  • Puede actualizar Azure Table Storage sin tener que actualizar y volver a implementar el complemento.
  • La instalación de SharePoint y Azure Table Storage no tienen ningún efecto en el rendimiento de los demás.
  • Azure Table Storage se escala fácilmente.
  • Puede hacer una copia de seguridad y restaurar Azure Table Storage independientemente del sitio de SharePoint.
  • No se pierden datos al desinstalar el complemento, a menos que el complemento use el evento AppUninstalled para eliminar los datos.

La interfaz del complemento muestra la clasificación de la encuesta del usuario actual en la página central. Si Azure Table Storage está vacío, el complemento agrega información a la tabla antes de mostrarla.

El código siguiente de CSRInfoController.cs define el método Home que recupera el nameId del usuario.

[SharePointContextFilter]
public ActionResult Home()
{
    var context = 
        SharePointContextProvider.Current.GetSharePointContext(HttpContext);
    var sharePointService = new SharePointService(context);
    var currentUser = sharePointService.GetCurrentUser();
    ViewBag.UserName = currentUser.Title;

    var surveyRatingsService = new SurveyRatingsService();
    ViewBag.Score = surveyRatingsService.GetUserScore(currentUser.UserId.NameId);

    return View();
}

El código siguiente del archivo SurveyRatingService.cs define el constructor deSurveyRatingsService, que configura la conexión a la cuenta de Azure Storage.

public SurveyRatingsService(string storageConnectionStringConfigName = 
        "StorageConnectionString")
{
    var connectionString = Util.GetConfigSetting("StorageConnectionString");
    var storageAccount = CloudStorageAccount.Parse(connectionString);

    this.tableClient = storageAccount.CreateCloudTableClient();
    this.surveyRatingsTable = this.tableClient.GetTableReference("SurveyRatings");
    this.surveyRatingsTable.CreateIfNotExists();
}

El código siguiente del mismo archivo define el método GetUserScore, que recupera la puntuación de encuesta del usuario de Azure Table Storage.

public float GetUserScore(string userName)
{
    var query = new TableQuery<Models.Customer>()
    .Select(new List<string> { "Score" })
    .Where(TableQuery.GenerateFilterCondition("Name", 
    QueryComparisons.Equal, userName));

    var items = surveyRatingsTable
         .ExecuteQuery(query)
             .ToArray();

    if (items.Length == 0)           
    return AddSurveyRatings(userName);

    return (float)items.Average(c => c.Score);
}

Si la tabla no contiene datos de encuesta relacionados con el usuario actual, el método AddSurveyRating asigna aleatoriamente una puntuación para el usuario.

private float AddSurveyRatings(string userName)
{
    float sum = 0;
    int count = 4;
    var random = new Random();

    for (int i = 0; i < count; i++)
    {
    var score = random.Next(80, 100);
    var customer = new Models.Customer(Guid.NewGuid(), userName, score);

    var insertOperation = TableOperation.Insert(customer);
    surveyRatingsTable.Execute(insertOperation);

    sum += score;
    }
    return sum / count;
}

Azure Queue Storage (escenario de cola de llamadas del cliente)

El escenario cola de llamadas del cliente enumera los autores de llamadas en la cola de soporte técnico y simula la realización de llamadas. El escenario usa Azure Queue Storage para almacenar datos y la API de Microsoft.WindowsAzure.Storage.Queue.CloudQueue API con Model-View-Controller.

Estas son las ventajas de usar este enfoque:

  • Azure Queue Storage admite más de un complemento.
  • Puede actualizar Azure Queue Storage sin tener que actualizar y volver a implementar el complemento.
  • La instalación de SharePoint y Azure Queue Storage no tienen ningún efecto en el rendimiento de los demás.
  • Azure Queue Storage se escala fácilmente.
  • Puede hacer una copia de seguridad y restaurar Azure Queue Storage independientemente del sitio de SharePoint.
  • No se pierden datos al desinstalar el complemento, a menos que el complemento use el evento AppUninstalled para eliminar los datos.

La interfaz del complemento muestra una cola de llamadas de soporte técnico en el panel central al elegir el vínculo Cola de llamadas. Puede simular la recepción de llamadas (agregar una llamada a la cola) eligiendo simular llamadasy puede simular la realización de la llamada más antigua (quitando una llamada de la cola) eligiendo la acción Realizar llamada asociada a una llamada determinada.

Esta página es una vista Model-View-Controller que se define en el archivo Views/CallQueue/Home.cshtml. El archivo Controllers/CallQueueController.cs define la clase CallQueueController, que contiene métodos para recuperar todas las llamadas de la cola, agregar una llamada a la cola (simular una llamada) y quitar una llamada de la cola (realizar una llamada). Cada uno de estos métodos llama a métodos definidos en el archivo Services/CallQueueService.cs, que usa la API de Azure Queue Storage para recuperar la información subyacente en la cola de almacenamiento.

public class CallQueueController : Controller
{
    public CallQueueService CallQueueService { get; private set; }

    public CallQueueController()
    {
        CallQueueService = new CallQueueService();
    }

    // GET: CallQueue
    public ActionResult Home(UInt16 displayCount = 10)
    {
        var calls = CallQueueService.PeekCalls(displayCount);
        ViewBag.DisplayCount = displayCount;
        ViewBag.TotalCallCount = CallQueueService.GetCallCount();
        return View(calls);
    }

    [HttpPost]
    public ActionResult SimulateCalls(string spHostUrl)
    {
        int count = CallQueueService.SimulateCalls();
        TempData["Message"] = string.Format("Successfully simulated {0} calls and added them to the call queue.", count);
        return RedirectToAction("Index", new { SPHostUrl = spHostUrl });
    }

    [HttpPost]
    public ActionResult TakeCall(string spHostUrl)
    {
        CallQueueService.DequeueCall();
        TempData["Message"] = "Call taken successfully and removed from the call queue!";
        return RedirectToAction("Index", new { SPHostUrl = spHostUrl });
    }
}

El archivo CallQueueService.cs define la clase CallQueueService, que establece la conexión a Azure Queue Storage. Esa clase también contiene los métodos para agregar, quitar (dequeuing) y recuperar las llamadas de la cola.

public class CallQueueService
{
    private CloudQueueClient queueClient;

    private CloudQueue queue;

    public CallQueueService(string storageConnectionStringConfigName = "StorageConnectionString")
    {
        var connectionString = CloudConfigurationManager.GetSetting(storageConnectionStringConfigName);
        var storageAccount = CloudStorageAccount.Parse(connectionString);

        this.queueClient = storageAccount.CreateCloudQueueClient();
        this.queue = queueClient.GetQueueReference("calls");
        this.queue.CreateIfNotExists();
        }

        public int? GetCallCount()
        {
        queue.FetchAttributes();
        return queue.ApproximateMessageCount;
    }

    public IEnumerable<Call> PeekCalls(UInt16 count)
    {
        var messages = queue.PeekMessages(count);

        var serializer = new JavaScriptSerializer();
        foreach (var message in messages)
        {
        Call call = null;
        try
        {
        call = serializer.Deserialize<Call>(message.AsString);
        }
        catch { }

        if (call != null) yield return call;
        }
    }

    public void AddCall(Call call)
    {
        var serializer = new JavaScriptSerializer();
        var content = serializer.Serialize(call);
        var message = new CloudQueueMessage(content);
        queue.AddMessage(message);
    }

    public void DequeueCall()
    {
        var message = queue.GetMessage();
        queue.DeleteMessage(message);
    }

    public int SimulateCalls()
    {
        Random random = new Random();
        int count = random.Next(1, 6);
        for (int i = 0; i < count; i++)
        {
        int phoneNumber = random.Next();
        var call = new Call
        {
        ReceivedDate = DateTime.Now,
        PhoneNumber = phoneNumber.ToString("+1-000-000-0000")
        };
        AddCall(call);

        return count;
    }
}

Azure SQL Database (escenario de pedidos recientes)

El escenario Pedidos recientes usa una llamada directa al Azure SQL Database Northwind para devolver todos los pedidos de un cliente determinado.

Estas son las ventajas de usar este enfoque:

  • Una base de datos puede admitir más de un complemento.
  • Puede actualizar el esquema de la base de datos sin tener que actualizar y volver a implementar el complemento, siempre y cuando los cambios de esquema no afecten a las consultas del complemento.
  • Una base de datos relacional puede admitir relaciones de varios a varios y, por tanto, admitir escenarios empresariales más complejos.
  • Puede usar herramientas de diseño de base de datos para optimizar el diseño de la base de datos.
  • Las bases de datos relacionales proporcionan un mejor rendimiento que las demás opciones cuando es necesario ejecutar operaciones complejas en las consultas, como cálculos y combinaciones.
  • Una Azure SQL Database permite importar y exportar datos fácilmente, por lo que es más fácil administrar y mover los datos.
  • No se pierden datos al desinstalar el complemento, a menos que el complemento use el event AppUninstalled para eliminar los datos.

La interfaz de pedidos recientes funciona de forma muy similar a la interfaz del panel del cliente. Elija el vínculo Pedidos recientes en la columna izquierda y, a continuación, elija un cliente en el menú desplegable de la parte superior del panel central. Aparece una lista de pedidos de ese cliente en el panel central.

Esta página es una vista Model-View-Controller definida en el archivo Views/CustomerDashboard/Orders.cshtml. El código del archivo Controllers/CustomerDashboardController.cs usa el Entity Framework para consultar la tabla Orders del Azure SQL Database. El identificador de cliente se pasa mediante un parámetro de cadena de consulta en la dirección URL que se pasa cuando el usuario selecciona un cliente en el menú desplegable. La consulta crea una combinación en las tablas Customer, Employeey Shipper. A continuación, el resultado de la consulta se pasa a la vista Modelo-Vista-Controlador que muestra los resultados.

El código siguiente del archivo CustomerDashboardController.cs realiza la consulta de base de datos y devuelve los datos a la vista.

public ActionResult Orders(string customerId)
{            
    Order[] orders;
    using (var db = new NorthWindEntities())
    {
            orders = db.Orders
                  .Include(o => o.Customer)
                  .Include(o => o.Employee)
                  .Include(o => o.Shipper)
                  .Where(c => c.CustomerID == customerId)
                  .ToArray();
    }

    ViewBag.SharePointContext = 
        SharePointContextProvider.Current.GetSharePointContext(HttpContext);

    return View(orders);
}

Vea también