Варианты хранения данных в SharePoint Online
В этой статье описывается пример приложения Core.DataStorageModels, который иллюстрирует каждый из перечисленных ниже вариантов хранения данных, а также их преимущества и недостатки.
- Список SharePoint на сайте надстройки
- Список SharePoint на хост-сайте
- Внешняя веб-служба
- Хранилище таблиц Azure
- Хранилище очередей Azure
- База данных SQL Azure
Пример приложения Core.DataStorageModels — это размещаемая у поставщика надстройка, написанная на C# и JavaScript, которая развертывает ряд артефактов SharePoint (списки, веб-часть надстройки, веб-часть) на хост-сайте и сайте надстройки. Она взаимодействует со списками SharePoint на сайте надстройки и хост-сайте, а также вызывает Базу данных SQL Azure, Хранилище очередей Azure, Хранилище таблиц Azure и удаленную веб-службу, реализующую OData. В этом примере используется шаблон Model-View-Controller.
В примере приложения Core.DataStorageModels для реализации различных функций применяются наиболее подходящие варианты хранения данных, описанные в приведенной ниже таблице.
Вариант хранения данных в примере приложения | Применение |
---|---|
Список SharePoint на сайте надстройки | Заметки клиентов |
Список SharePoint на хост-сайте | Обращения в службу поддержки |
Веб-служба OData Northwind | Клиенты |
Хранилище таблиц Azure | Оценки по результатам опроса представителей клиентов |
Хранилище очередей Azure | Очередь звонков |
База данных Northwind в Azure SQL | Заказы, сведения о заказах, продукты |
В примере приложения реализуется информационная панель службы поддержки клиентов и соответствующие интерфейсы, которые показывают недавние заказы, оценки по результатам опросов представителей клиентов, заметки клиентов, обращения в службу поддержки и очередь звонков для представителей клиентов.
Первые два сценария дают возможность получать данные с помощью относительно простого кода клиентской объектной модели или запросов REST, но ограничены порогами для запросов к спискам. В следующих четырех сценариях используются удаленные хранилища различных типов.
Начальная страница моделей хранения данных с предложением развернуть компоненты SharePoint
Перед началом работы
Перед использованием этого примера убедитесь, что у вас есть перечисленные ниже обязательные компоненты.
Учетная запись Microsoft Azure, в которой можно развернуть Базу данных SQL Azure и создать учетную запись службы хранилища Azure.
Сайт разработчика SharePoint для развертывания примера из Visual Studio.
Вам также потребуется развернуть базу данных Northwind в Microsoft Azure.
Развертывание базы данных Northwind
Войдите на портал Azure и выберите Базы данных SQL>Серверы.
Нажмите Создать сервер базы данных SQL.
В форме Создание сервера заполните поля Имя для входа, Пароль для входа и Регион.
Установите флажок для завершения и создайте сервер.
Теперь, когда вы создали базу данных, выберите имя созданного сервера.
Выберите команду НАСТРОИТЬ, нажмите стрелку в правом нижнем углу, чтобы завершить настройку, а затем нажмите кнопку Сохранить.
Откройте SQL Server Management Studio на локальном компьютере для разработки и создайте базу данных под названием NorthWind.
В обозревателе объектов выберите базу данных Northwind, а затем нажмите Создать запрос.
В любом текстовом редакторе откройте скрипт SQL northwind.sql, который предоставляется вместе с примером Core.DataStorageModels .
Скопируйте текст из файла northwind.sql и вставьте его в окно SQL-запрос в SQL Server Management Studio, а затем нажмите кнопку Выполнить.
В обозревателе объектов откройте контекстное меню (правой кнопкой мыши) базы данных Northwind, выберите Задачи, а затем нажмите Развернуть базу данных в SQL Azure.
На экране Введение нажмите кнопку Далее.
Нажмите кнопку Подключиться, а затем укажите имя сервера Azure SQL Database, который вы только что создали.
В списке Проверка подлинности выберите пункт Проверка подлинности SQL Server.
Введите имя пользователя и пароль, которые использовались при создании сервера Базы данных SQL Azure, а затем нажмите кнопку Подключиться.
Нажмите кнопку Далее, а затем — кнопку Готово и дождитесь создания базы данных. После ее создания нажмите кнопку Закрыть, чтобы закрыть мастер.
Вернитесь на портал Azure, чтобы убедиться, что база данных Northwind успешно создана. Она должна отображаться на экране sql databases.
Выберите базу данных Northwind, а затем выберите команду Просмотреть строки подключения базы данных SQL.
Скопируйте строку подключения и вставьте ее в текстовый файл, а затем сохраните его в локальной среде. Эта строка подключения потребуется позже. Закройте диалоговое окно Строки подключения.
Перейдите по ссылке Настроить правила брандмауэра Microsoft Azure для этого IP-адреса и добавьте IP-адрес в правила брандмауэра, чтобы получить доступ к базе данных.
Откройте проект Core.DataStorageModels.sln в Visual Studio.
В обозревателе решений Visual Studio найдите файл Web.config.
В файле Web.config найдите элемент
name="NorthWindEntities"
и замените имеющееся значениеconnectionString
строкой подключения, сохраненной в локальной среде на этапе 19.<add name="NorthWindEntities" connectionString="metadata=res://*/Northwind.csdl|res://*/Northwind.ssdl|res://*/Northwind.msl;provider=System.Data.SqlClient;provider connection string=&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&quot;" providerName="System.Data.EntityClient" />
Сохраните файл Web.config.
Список SharePoint на сайте надстройки (сценарий с заметками)
Сценарий с заметками, в котором используется список SharePoint на сайте надстройки, показывает, как работают списки на сайте надстройки SharePoint. На сайте надстройки создается список заметок с заголовком и полем описания. REST API SharePoint отправляет запрос к списку заметок и возвращает все заметки по идентификатору клиента.
Использование списков на сайте надстройки имеет одно важное преимущество перед другими решениями для хранения: вы можете использовать простые вызовы REST API SharePoint, чтобы запрашивать данные.
Однако у него есть некоторые недостатки.
- Чтобы обновить метаданные списка, необходимо обновить и заново развернуть надстройку.
- Чтобы обновить структуру данных, необходимо переписать логику приложения для хранения и обновления данных.
- Информацию в списке невозможно легко передавать другим надстройкам.
- Невозможно искать данные в SharePoint.
- Объем данных, которые можно хранить в списках, и размер наборов результатов запросов ограничены.
В коде раздела заметок на информационной панели клиентов используются запросы REST для получения данных из списка, развернутого на сайте надстройки. Этот список содержит поля заголовков, авторов, идентификаторов клиентов и описаний. С помощью интерфейса надстройки можно добавлять и получать заметки для определенного клиента, как показано на приведенном ниже рисунке.
Пользовательский интерфейс надстройки “Заметки”
По ссылке View Notes List in App Web (Показать список заметок на сайте приложения) доступно готовое представление данных из списка.
В этой надстройке используется шаблон Model-View-Controller. Вы можете просмотреть код для сценария с заметками в файле Views/CustomerDashboard/Notes.cshtml. В нем используются простые вызовы REST для добавления и получения данных.
Приведенный ниже код получает заметки из списка для определенного клиента.
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" +
"&$expand=Author/ID,Author/Title" +
"&$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)) }
}
);
}
Приведенный ниже код добавляет заметку для определенного клиента в список заметок.
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
});
}
Вы можете добавить в список 5000 элементов, чтобы показать, что запросы к списку, создающие набор из 5000 или более результатов, достигают порогового значения и завершаются ошибкой. Вы также можете добавить в список на сайте надстройки столько данных, что будет превышено ограничение хранилища для семейства веб-сайтов (оно зависит от выделенного места в хранилище).
Эти сценарии иллюстрируют два наиболее важных ограничения данного подхода: пределы размера запросов к спискам и места в хранилище. Если в вашей компании приходится работать с большими наборами данных и результатов запросов, то этот подход не сработает.
Порог запросов к спискам
Чтобы загрузить достаточно данных для превышения порога запросов к спискам, выполните указанные ниже действия.
В меню слева выберите пункт Sample Home Page (Пример домашней страницы).
В разделе List Query Thresholds (Пороги запросов к спискам) выберите Add list items to the Notes list in the add-in web (Добавить элементы списка в список заметок на сайте надстройки).
Следуя инструкциям над кнопкой, выполните эту операцию 10 раз.
При обновлении списка заметок в верхней части страницы появится сообщение о том, сколько элементов списка (заметок) уже добавлено и сколько осталось добавить.
Примечание.
При каждом нажатии кнопки выполнение этой операции занимает одну минуту. На следующем рисунке показан конечный результат 10-кратного выполнения этой операции.
Добавив 5001 элемент в список, выберите Notes (Заметки) в меню слева. При загрузке страницы вы увидите сообщение об ошибке, показанное на приведенном ниже рисунке. Оно поступает от REST API SharePoint.
Нажмите View Notes List in App Web (Показать список заметок на сайте надстройки) и прокрутите список, чтобы увидеть, что он содержит 500 строк. Обратите внимание, что хотя представления списков SharePoint поддерживают просмотр такого количества пунктов, происходит сбой REST API в связи с порогом регулирования запросов к спискам.
Ограничение хранилища данных
Чтобы загрузить достаточно данных для превышения ограничения хранилища данных, выполните указанные ниже действия.
В меню слева выберите пункт Sample Home Page (Пример домашней страницы).
В разделе “Порог данных” нажмите Fill the App Web Notes list with 1 GB of data (Добавить 1 ГБ данных в список заметок на сайте приложения).
Следуя инструкциям над кнопкой Fill the App Web Notes list with 1 GB of data (Добавить 1 ГБ данных в список заметок на сайте приложения), выполните эту операцию 11 раз.
При обновлении списка заметок в верхней части страницы появится сообщение о том, сколько элементов списка (заметок) уже добавлено и сколько осталось добавить.
Примечание.
При каждом нажатии кнопки выполнение этой операции занимает одну минуту. На следующем рисунке показан конечный результат 11-кратного выполнения этой операции.
После 11-кратного выполнения операции при нажатии кнопки появляется сообщения об ошибке, как показано на приведенном ниже рисунке.
После превышения ограничения хранилища нажмите кнопку “Назад” в браузере, а затем перейдите по ссылке Notes (Заметки) в меню слева.
Нажмите View Notes List in App Web (Показать список заметок на сайте приложения).
После загрузки страницы в верхней части страницы появится сообщение об ошибке, где указывается, что на сайте закончилось место в хранилище.
Список SharePoint на хост-сайте (сценарий с обращениями в службу поддержки)
В сценарии с обращениями в службу поддержки отображаются данные, которые хранятся в списке SharePoint на хост-сайте. В этом сценарии используются два разных шаблона для доступа к данным и взаимодействия с ними. Первый шаблон включает службу поиска SharePoint и веб-часть “Контент по поиску” с пользовательским шаблоном отображения. Второй шаблон включает веб-часть приложения (клиентскую веб-часть), которая выводит представление Model-View-Controller, где используется класс SP.RequestExecutor для вызова REST API SharePoint.
У этого подхода есть ряд преимуществ.
- Вы можете легко запрашивать данные с помощью простых запросов REST или кода клиентской объектной модели.
- Вы можете искать данные в SharePoint.
- Вы можете обновлять метаданные списка и создавать новые представления без обновления и повторного развертывания надстройки. Эти изменения не повлияют на поведение надстройки.
- Списки на хост-сайте не удаляются при удалении надстройки, если только в надстройке не используется событие AppUninstalled для удаления списка и/или данных.
Эти преимущества компенсируются перечисленными ниже недостатками.
- Хост-сайт ограничивает как объем данных, которые можно хранить в списках, так и размер результатов запроса. Если вашей компании необходимо хранить и/или запрашивать большие наборы данных, не рекомендуется использовать этот подход.
- В случае сложных запросов списки работают не так эффективно, как базы данных.
- При резервном копировании и восстановлении данных списки работают не так эффективно, как базы данных.
Данные для этого сценария хранятся в списке SharePoint, развернутом на хост-сайте. Для получения и отображения данных используются:
- веб-часть “Поиск контента”;
- веб-часть приложения, реализованная в виде представления Model-View-Controller.
В коде этого представления используются запросы REST для получения информации из списка, а веб-часть “Поиск контента” получает данные с помощью службы поиска SharePoint. Эти два подхода демонстрируют значительное преимущество этого варианта: вы можете получать информацию из списка на хост-сайте как с помощью службы поиска, так и при помощи API REST/CSOM.
Выбрав клиента из списка обращений в службу поддержки, вы увидите данные об обращениях этого клиента как в основной веб-части, так и в веб-части приложения. Изначально веб-часть может не возвращать контент, поскольку индексированные данных службой поиска SharePoint может занять до 24 часов. Вы также можете перейти по ссылке View Support Cases List in Host Web (Показать список обращений в службу поддержки на хост-сайте), чтобы увидеть традиционное представление данных списка.
Пользовательский интерфейс для сценария с обращениями в службу поддержки
В веб-части “Поиск контента”, развернутой этой надстройкой, используется пользовательский шаблон отображения. На приведенном ниже рисунке показано, где в каталоге Assets веб-проекта можно найти веб-часть и соответствующий шаблон.
Содержимое каталога Assets веб-проекта
Приведенный ниже код JavaScript, который можно найти в файле Views/SupportCaseAppPart/Index.cshtml file, используется междоменная библиотека для отправки запроса REST к списку SharePoint на хост-сайте.
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 + "')" +
"&$top=30" +
"&$select=Id,Title,FTCAM_Status,FTCAM_CSR" +
"&@@target='" + hostWebUrl + "'",
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: successHandler,
error: errorHandler
}
);
}
Вы можете добавить в список 5000 элементов, чтобы показать, что запросы к списку, создающие набор из 5000 или более результатов, достигают порогового значения и завершаются ошибкой. Эти сценарии иллюстрируют одно из наиболее важных ограничений этого подхода: пределы размера запросов к спискам. Если в вашей компании приходится работать с большими наборами данных и результатов запросов, то этот подход не сработает. Дополнительные сведения см. в разделе Порог запросов к спискам ранее в этой статье.
Веб-служба OData Northwind (сценарий с информационной панелью клиентов)
В сценарии с информационной панелью клиентов используется JQuery AJAX для вызова службы OData NorthWind и возврата информации о клиенте. Надстройка хранит свои данные в веб-службе и получает их с помощью OData.
У этого подхода есть ряд преимуществ.
- Одна веб-служба может поддерживать несколько надстроек.
- Вы можете обновлять веб-службу без обновления и повторного развертывания надстроек.
- Установки SharePoint и веб-служб не влияют друг на друга.
- Службы размещения, такие как Microsoft Azure, дают возможность масштабировать веб-службы.
- Вы можете создавать резервные копии информации и восстанавливать их в отдельных веб-службах с сайта SharePoint.
- При удалении надстройки не теряются данные, если только в надстройке не используется событие AppUninstalled для удаления данных.
В сценарии с информационной панелью клиентов данные хранятся в веб-службе, где реализован стандарт OData для получения данных. В интерфейсе информационной панели клиентов вы выбираете клиента из раскрывающегося меню, после чего сведения о нем появляются на панели Информация о клиенте.
Эта страница пользовательского интерфейса является представлением Model-View-Controller. Режим отображения определяется в файле Views/CustomerDashboard/Home.cshtml. Базовый код содержится в файле Scripts/CustomerDashboard.js. Код JavaScript использует AJAX для запросов к веб-службе Northwind. Поскольку это служба OData, запрос к веб-службе состоит из аргументов строки запроса, прикрепленных к URL-адресу, который указывает на конечную точку веб-службы. Служба возвращает информацию о клиентах в формате JSON.
Приведенный ниже код выполняется при переходе по ссылке Информационная панель клиентов. Он извлекает все имена клиентов и идентификаторы для заполнения раскрывающегося меню.
var getCustomerIDsUrl = "https://odatasampleservices.azurewebsites.net/V3/Northwind/Northwind.svc/Customers?$format=json&$select=CustomerID";
$.get(getCustomerIDsUrl).done(getCustomerIDsDone)
.error(function (jqXHR, textStatus, errorThrown) {
$('#topErrorMessage').text('Can\'t get customers. An error occurred: ' + jqXHR.statusText);
});
Приведенный ниже код выполняется при выборе имени клиента в раскрывающемся меню. В нем используется аргумент OData $filter для указания идентификатора клиента и других аргументов строки запроса с целью получения информации о соответствующем клиенте.
var url = "https://odatasampleservices.azurewebsites.net/V3/Northwind/Northwind.svc/Customers?$format=json" + "&$select=CustomerID,CompanyName,ContactName,ContactTitle,Address,City,Country,Phone,Fax" + "&$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 (сценарий с опросом о службе поддержки)
В этом сценарии представитель службы поддержки может увидеть свой рейтинг по результатам опросов клиентов. В нем используются Хранилище таблиц Azure и API Microsoft.WindowsAzure.Storage.Table.CloudTable для хранения данных и взаимодействия с ними.
У этого подхода есть ряд преимуществ.
- Хранилище таблиц Azure поддерживает работу с несколькими надстройками.
- Вы можете обновлять Хранилище таблиц Azure без обновления и повторного развертывания надстройки.
- Установка SharePoint и Хранилище таблиц Azure не влияют на производительность друг друга.
- Хранилище таблиц Azure легко масштабируется.
- Вы можете создавать резервные копии Хранилища таблиц Azure и восстанавливать их в отдельных веб-службах с сайта SharePoint.
- При удалении надстройки не теряются данные, если только в надстройке не используется событие AppUninstalled для удаления данных.
В интерфейсе надстройки на центральной странице отображается рейтинг текущего пользователя. Если соответствующее Хранилище таблиц Azure окажется пустым, надстройка добавляет в таблицу некоторую информацию, а затем показывает ее.
Приведенный ниже код из файла CSRInfoController.cs определяет метод Home для получения свойства nameId пользователя.
[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();
}
Приведенный ниже код из файла SurveyRatingService.cs определяет конструктор SurveyRatingsService, который настраивает подключение к учетной записи службы хранилища Azure.
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();
}
Приведенный ниже код из того же файла определяет метод GetUserScore, который получает оценку пользователя по результатам опроса из Хранилища таблиц Azure.
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);
}
Если таблица не содержит никаких данных опросов о текущем пользователе, метод AddSurveyRating назначает пользователю случайную оценку.
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 (сценарий с очередью звонков клиентов)
В сценарии с очередью звонков клиентов отображается список звонящих из очереди службы поддержки и имитируется прием звонков. В этом сценарии используются Хранилище очередей Azure для хранения данных и API Microsoft.WindowsAzure.Storage.Queue.CloudQueue с Model-View-Controller.
У этого подхода есть ряд преимуществ.
- Хранилище очередей Azure поддерживают работу с несколькими надстройками.
- Вы можете обновить Хранилище очередей Azure без обновления и повторного развертывания надстройки.
- Установка SharePoint и Хранилище очередей Azure не влияют на производительность друг друга.
- Хранилище очередей Azure легко масштабируется.
- Вы можете создавать резервные копии Хранилища очередей Azure и восстанавливать их в отдельных веб-службах с сайта SharePoint.
- При удалении надстройки не теряются данные, если только в надстройке не используется событие AppUninstalled для удаления данных.
В интерфейсе надстройки при переходе по ссылке Очередь звонков на центральной панели отображается очередь звонков в службу поддержки. Вы можете имитировать прием звонков (добавление звонка в очередь), выбрав параметр Simulate Calls (Имитировать звонки), а также имитировать прием самого старого звонка (с удалением из очереди), выбрав действие Принять звонок, связанное с определенным звонком.
Эта страница является представлением Model-View-Controller, определенным в файле Views/CallQueue/Home.cshtml. В файле Controllers/CallQueueController.cs определяется класс CallQueueController, который содержит методы для получения всех звонков из очереди, добавления звонка в очередь (имитации звонка) и удаления звонка из очередь (приема). Каждый из этих методов вызывает методы, определенные в файле Services/CallQueueService.cs, который использует API Хранилища очередей Azure для получения базовой информации об очереди хранилища.
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 });
}
}
В файле CallQueueService.cs определяется класс CallQueueService, который устанавливает подключение к Хранилищу очередей Azure. Этот класс также содержит методы для добавления, удаления (исключения из очереди) и получения звонков из очереди.
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;
}
}
База данных SQL Azure (сценарий с недавними заказами)
В сценарии с недавними заказами совершается прямой вызов Базы данных SQL Azure для возврата всех заказов определенного клиента.
У этого подхода есть ряд преимуществ.
- База данных может поддерживать несколько надстроек.
- Вы можете обновлять схему базы данных без обновления и повторного развертывания надстройки, при условии что изменения схемы не повлияют на запросы в надстройке.
- Реляционная база данных поддерживает отношения “многие ко многим”, а значит и более сложные бизнес-сценарии.
- Вы можете оптимизировать оформление базы данных с помощью инструментов проектирования баз данных.
- Реляционные базы данных обеспечивают более высокую производительность, чем другие варианты, когда в запросах требуется выполнять сложные операции, например расчеты и объединения.
- База данных SQL Azure дает возможность легко импортировать и экспортировать данные, поэтому их проще контролировать и перемещать.
- При удалении надстройки не теряются никакие данные, если только в надстройке не используется событие AppUninstalled для удаления данных.
Интерфейс недавних заказов работает во многом аналогично интерфейсу информационной панели клиентов. Вы переходите по ссылке Recent Orders (Недавние заказы) в левом столбце, а затем выбираете клиента из раскрывающегося меню в верхней части центральной панели. На центральной панели появляется список заказов от соответствующего клиента.
Эта страница является представлением Model-View-Controller, определенным в файле Views/CustomerDashboard/Orders.cshtml. В коде из файла Controllers/CustomerDashboardController.cs используется Entity Framework, чтобы запросить таблицу Orders из Базы данных SQL Azure. Идентификатор клиента передается с помощью параметра строки запроса в URL-адресе, передаваемого, когда клиент выбирает клиента из раскрывающегося меню. Запрос объединяет таблицы Customer, Employee и Shipper. Затем результат запроса передается в представление Model-View-Controller, где отображаются результаты.
Приведенный ниже код из файла CustomerDashboardController.cs отправляет запрос к базе данных и возвращает данные в представление.
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);
}