Это было дольше, чем я планировал, но этот пост является продолжением моего обзорного поста «Создание данных и служб для приложений Windows 8» . В этом посте я описал несколько различных способов создания хранилища данных и сервисов для предоставления серверной части для вашего приложения Windows 8 (и, конечно, эти сервисы могут использоваться и другими приложениями).
Я представил сценарий создания службы списка игровых лидеров, которая могла бы обеспечить центральное расположение для хранения результатов для разных игр и позволить этим играм хранить как обновленные результаты, так и извлекать список результатов для этой игры. Я также продемонстрировал основы двух игр, которые планирую использовать: Catapult Wars, пример игры XNA, портированной на HTML5 моим коллегой-техническим евангелистом Крисом Боуэном , и Space Cadet, пример игры, созданной моим коллегой-техническим евангелистом Дэвидом Исбицким .
В этой статье я расскажу о шагах, необходимых для создания хранилища данных и сервисов для нашей таблицы лидеров игр с использованием OData и на основе базовых технологий SQL Azure (для базы данных), Entity Framework и WCF Data Services. , Во второй части, которую я опубликую завтра, я расскажу о публикации своего сервиса в Windows Azure и его подключении к играм Windows 8 на JavaScript.
Создание базы данных
В этом сценарии я собираюсь начать с базы данных, поскольку именно туда нужно будет отправлять данные.
Перво-наперво, если у вас еще нет учетной записи Windows Azure , вам нужно ее создать. Если вы являетесь подписчиком MSDN , многие планы MSDN включают в себя различные ресурсы Azure , включая часы работы, базы данных SQL Azure и многое другое. Если у вас нет подписки MSDN, вы можете подписаться на 90-дневную пробную версию , которая предоставит вам все необходимое для выполнения, и по умолчанию включает ограничение расходов, чтобы гарантировать, что у вас нет — карманные расходы, если ваши услуги превысят лимиты пробного обслуживания (если ваши услуги превысят лимиты пробного периода, они будут автоматически закрыты).
После того, как я настроил учетную запись Windows Azure, я захожу на портал управления Windows Azure , после чего я должен увидеть экран, который выглядит примерно так:
Обратите внимание, что в моем случае у меня уже есть несколько служб в моей учетной записи. Для новой учетной записи у вас не будет никаких служб, отображаемых на портале управления при входе в систему.
Создать новую базу данных очень просто. Я просто нажимаю на ссылку + New в левом нижнем углу страницы, выбираю DATA SERVICES | База данных SQL | БЫСТРЫЙ СОЗДАТЬ, и заполните необходимые поля, как показано ниже. Если вы подписаны, обязательно запишите имя базы данных, логин и пароль для дальнейшего использования:
После заполнения всех обязательных полей я нажимаю ссылку CREATE SQL DATABASE, и база данных (и сервер базы данных, если вы не используете существующий сервер в своей учетной записи) будут созданы и добавлены на портал управления.
Если я затем нажимаю на имя новой базы данных, я вижу экран, подобный следующему:
Обратите внимание на выделенные области, которые включают ссылки для отображения строк подключения (они понадобятся для подключения к вашей базе данных SQL Azure из Visual Studio), управления разрешенными IP-адресами (чтобы разрешить определенным IP-адресам или диапазонам доступ к серверу базы данных из снаружи) и полное имя сервера экземпляра сервера, на котором установлена база данных. На портале я могу сделать гораздо больше, но это выходит за рамки этого поста, поэтому я перейду к созданию схемы базы данных.
Создание схемы
Чтобы сохранить этот пост, я не буду вдаваться в подробности создания схемы данных. Это может быть выполнено с помощью SQL Server Management Studio (вам нужно, чтобы последняя версия была подключена к SQL Azure), или с помощью проводника объектов SQL Server в Visual Studio 2012 (в итоге я использовал это, поскольку у меня уже установлена Visual Studio 2012 Ultimate и у меня нет локальной копии SQL Server на этом компьютере).
В Обозревателе объектов SQL Server я просто нажимаю кнопку «Добавить SQL Server» в верхней части окна, затем в диалоговом окне «Подключиться к серверу» введите необходимую информацию для базы данных SQL Azure (которую вы можете получить по ссылкам портала выше) , вот так:
ПРИМЕЧАНИЕ. Если вы подписаны и получаете сообщение об ошибке, что не можете подключиться, вам нужно перейти на портал Windows Azure и нажать ссылку «Управление разрешенными IP-адресами», указанную выше, и добавить свой текущий IP-адрес клиента в списке разрешенных. Вы всегда можете удалить это позже, как только развернете свой сервис.
После подключения к базе данных я углубляюсь в дерево серверов, нахожу свою базу данных и открываю узел Таблицы. Я щелкаю правой кнопкой мыши узел «Таблицы» и выбираю «Добавить новую таблицу» и добавляю нужные столбцы и любые требуемые ограничения (например, я обычно устанавливаю в столбце Id использование функции идентификации SQL Server для автоматического увеличения ее значения). Я также установил значения по умолчанию для столбцов Wins, Losses и Ties, как показано ниже:
Как упоминалось в моем предыдущем обзоре , для нашего примера я держу схему довольно простой. Теперь, когда моя база данных настроена, а таблица и схема заполнены, давайте посмотрим, как я могу начать предоставлять некоторые данные так, чтобы их можно было легко использовать в приложении для Windows 8.
Создание проекта
ПРИМЕЧАНИЕ. В этом руководстве предполагается, что вы уже установили последнюю версию Windows Azure SDK . Если вы еще этого не сделали, перейдите сюда и найдите ссылку «установить SDK» в верхней части страницы и следуйте инструкциям по установке SDK.
Поскольку в моем случае планируется развернуть это решение в Windows Azure, я собираюсь начать с проекта облачной службы Windows Azure с использованием C #, как показано ниже (обратите внимание, что для локальной отладки облачной службы Windows Azure мне потребуется запустить Visual Studio от имени администратора):
Конечно, если вы уже работали с Azure , вы уже знаете, что мне также нужно выбрать, какую роль я хочу в нашей облачной службе, и для моих целей мне нужна веб-роль службы WCF, которую я Мы назовем GameLeaderServiceOData, как показано ниже (вы можете изменить имя своего проекта веб-роли, наведя курсор мыши на элемент в правой панели и щелкнув значок карандаша):
Когда проект будет создан, Visual Studio откроет файл кода службы по умолчанию, Services1.svc.cs. Мне это не нужно (потому что я скоро добавлю свой собственный сервис), поэтому я закрою его и удалю как Service1.svc (и его файл с выделенным кодом), так и IService1.cs.
Создать модель данных
Опять же, в интересах простоты, я собираюсь использовать Entity Framework для быстрого построения модели данных на основе схемы, которую я создал в своей базе данных Windows Azure SQL. Для начала я добавлю новую модель данных сущности ADO.NET в свой проект (Project | Add New Item …) и назову ее Scores.edmx, как показано ниже:
Я выберу «Создать из базы данных» для содержимого модели, затем выберите «Новое подключение» для подключения к базе данных и предоставлю информацию о подключении для моей базы данных SQL Azure, созданной ранее. Для простоты, и поскольку это скорее демонстрационный, чем производственный код, я храню пароль как часть настроек соединения сущностей в web.config. ВАЖНО : Вы всегда должны оценивать потребности вашего приложения в безопасности и делать лучший выбор для безопасности настроек вашего соединения, в частности паролей, которые могут включать шифрование или установку паролей соединения с помощью кода, а не сохранять в файлах конфигурации. , Однако лучшие практики для этого выходят за рамки этого поста.
Для моих объектов базы данных я просто выберу таблицу Scores, созданную ранее, и приму значения по умолчанию для остальных параметров (для получения дополнительной информации о мастере Entity Data Model Wizard см. Этот раздел в MSDN ):
Как только я нажму «Готово», Visual Studio создаст модель данных и откроет диаграмму модели, которая содержит единую сущность Score.
Теперь, когда у меня есть модель, пришло время завернуть ее в хороший сервис.
Создание службы OData
Если вы еще не знакомы с ним, OData — это краткое имя Open Data Protocol , веб-протокола для запроса и обновления данных. OData сама по себе является просто спецификацией, в то время как реализация может принимать различные формы в зависимости от поставщика, предоставляющего реализацию. Одной из реализаций протокола OData от Microsoft является WCF Data Services (совсем недавно Microsoft добавила поддержку OData в стек ASP.NET Web API , о котором я расскажу в следующей статье этой серии).
Чтобы убедиться, что у меня есть новейшие и лучшие функции для моей службы данных WCF, я собираюсь воспользоваться встроенной в Visual Studio поддержкой технологии упаковки NuGet, которая позволяет различным разработчикам (как внутренним, так и Microsoft). а также сторонние разработчики и разработчики сообщества) предоставлять обновленные пакеты для своих библиотек и компонентов, которые я легко могу добавить и обновить на уровне проекта с помощью диспетчера пакетов библиотек, либо через командную строку, либо через графический интерфейс, прямо в моем Visual Студийный проект):
Когда я нажимаю «Установить», NuGet добавит сборки WCF Data Services Server (вместе со всеми зависимостями) в мой проект, добавит необходимые ссылки, и тогда я готов.
ПРИМЕЧАНИЕ. Одной из важных причин обновления до последней версии служб данных WCF является то, что в версии 5.1 добавлена поддержка параметра запроса формата , который позволяет указать, что служба должна возвращать данные в формате JSON, а не стандартную ATOM- Паб в формате. Это очень полезно в тех случаях, когда вы не можете передать заголовок HTTP, чтобы указать желаемый формат, например, когда вы тестируете свою службу в браузере или используете API, которые позволяют вам передавать URI службы только как часть API.
Следующим шагом в создании моей таблицы лидеров является добавление новой службы данных WCF в мой проект, как показано ниже:
Как только я добавлю сервис в свой проект, Visual Studio откроет файл GameLeaderServiceOData.svc.cs, в котором содержится реализация моего сервиса, и мне нужно немного изменить его, чтобы он работал. Требуется минимум два изменения:
- В объявлении класса мне нужно указать имя класса источника данных (в моем случае это имя сущности из нашей модели данных, а именно GameLeaderODataEntities).
- В InitializeServiceMethod мне нужно настроить правила доступа для объекта. В моем случае я собираюсь предоставить AllRead и AllWrite. Обратите внимание, что этот шаг предоставляет эти разрешения всем, у кого есть URL-адрес конечной точки OData, поэтому, если вы хотите ограничить доступ для аутентифицированных пользователей, вам также необходимо предоставить (с помощью конфигурации или кода) аутентификацию в вашем решении.
Обновленный код для моего сервиса выглядит так:
namespace GameLeaderServiceOData { public class GameLeaderServiceOData : DataService<GameLeaderODataEntities> { // This method is called only once to initialize service-wide policies. public static void InitializeService(DataServiceConfiguration config) { // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc. // Examples: config.SetEntitySetAccessRule("Scores", EntitySetRights.AllRead | EntitySetRights.AllWrite); // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3; } } }
Обратите внимание, что, поскольку я обновил версию служб данных WCF с помощью NuGet, в IDE возникла ошибка в DataServiceProtocolVersion.V3 в строке 12. Проблема заключалась в том, что ссылка на предыдущую версию System.Data.Services.Client (которая включен по умолчанию при создании новой службы) не был удален NuGet при добавлении обновленной версии. Удаление ссылки на System.Data.Services.Client устранило эту проблему.
На данный момент, предполагая, что я предоставил все правильные учетные данные и у меня есть данные в моей базе данных, я должен быть готов протестировать свой сервис.
Тестирование Сервиса
Тестировать мой новый сервис довольно просто, я могу просто нажать клавишу F5, и Visual Studio создаст мой проект, запустит эмуляторы вычислений и хранения Azure и запустит мой проект с помощью IIS Express, а затем откроет URL-адрес службы в браузере. , как показано ниже:
Обратите внимание, что пока я отлаживаю локально, моей службе вообще не нужно подключаться к Windows Azure. Инструменты Windows Azure SDK предоставляют все необходимое для запуска «облака» прямо на моем рабочем столе.
В первоначальном ответе службы перечислены объекты, с которыми можно работать, используя формат ATOM-pub. Чтобы просмотреть отдельные записи, я могу просто добавить имя объекта в URI:
По умолчанию я не вижу данных ATOM-Pub, потому что IE по умолчанию передает представление читателя. Если я отключу представление программы чтения каналов, я смогу увидеть базовые данные в формате XML (ATOM-Pub), которые содержат оба значения для каждого из свойств сущности, а также метаданные, чтобы помочь клиентам OData понять основные типы данных и т. Д. :
Кроме того, если я хочу работать с данными, более совместимыми с приложениями JavaScript, которые я предпочитаю для Магазина Windows, я могу изменить URI службы, чтобы запрашивать данные в формате JSON, например: http://127.0.0.1:81 /GameLeaderServiceOData.svc/Scores?$format=json. Это побудит меня открыть или сохранить файл с именем Scores.js, который выглядит следующим образом:
{"odata.metadata":"http://127.0.0.1:81/GameLeaderServiceOData.svc/$metadata#Scores","value":[ {"Id":3,"Game":"Space Cadet","Player":"Seeker","Score1":500,"Wins":0,"Losses":0,"Ties":0}, {"Id":4,"Game":"Catapult Wars","Player":"Seeker","Score1":null,"Wins":1,"Losses":3,"Ties":0}, {"Id":5,"Game":"Space Cadet","Player":"Player1","Score1":800,"Wins":null,"Losses":null,"Ties":null}]}
Как видите, в моей базе 3 записи. Одним приятным преимуществом JSON является то, что это очень компактный способ представления данных, но вы могли заметить, что он не встраивает метаданные в файл .js. Однако обратите внимание, что данные JSON включают ссылку на URI метаданных, поэтому клиенты, заинтересованные в метаданных, знают, где их найти.
Богатые Запросы
Одним из основных преимуществ использования службы OData для серверной таблицы лидеров является то, что OData поддерживает богатый синтаксис запросов, который позволяет легко получать только те данные, которые мне нужны, с помощью некоторых простых параметров строки запроса. Например, предположим, что по приведенным выше данным я хотел получить только оценки для игры Space Cadet. Я мог бы просто использовать параметр запроса $ filter, чтобы ограничить запрос (добавив параметр запроса $ format, если бы я хотел JSON вместо формата ATOM):
http://127.0.0.1:81/GameLeaderServiceOData.svc/Scores?$filter=Game eq ‘Space Cadet’ & $ format = json
OData также поддерживает упорядочение через параметр $ orderby, а также разбиение по страницам через параметры $ top и $ skip:
http://127.0.0.1:81/GameLeaderServiceOData.svc/Scores?$filter=Game eq ‘Space Cadet’ & $ orderby = Score1 desc & $ top = 10
OData поддерживает еще много параметров запроса, о которых вы можете прочитать в документации по протоколу OData (особый интерес представляют документы OData Core и URL Conventions).
Если вы работаете с OData на платформе, где есть клиентская библиотека OData (например, приложения Магазина Windows на основе XAML), вы можете использовать запросы в стиле LINQ, но приведенный выше синтаксис запросов на основе URL-адресов действительно отлично подходит для работы с из запросов JavaScript и xhr (XmlHttpRequest).
Подведение итогов (на данный момент)
Мой сервис сейчас работает и работает локально, и в целях сохранения этого поста в разумных пределах, я пока остановлюсь здесь. Завтра я расскажу, как я могу взять свой локальный сервис и опубликовать его в Windows Azure, чтобы он был доступен где угодно и когда угодно, а затем рассказать о том, как я могу интегрировать свой сервис с парой игр Windows 8 на основе JavaScript.
Пока вы ждете часть 2, зайдите в Generation App . Пока вы там, подпишитесь, чтобы получать советы по разработке приложений для Windows 8, и следите за конкурсами и рекламными акциями. Я знаю пару местных разработчиков в Mid-Atlantic, которые получили бесплатные планшеты Samsung под управлением Windows 8 в результате публикации своих приложений в Магазине Windows. Кто знает, что может предложить следующий конкурс …