Введение в облачные решения Microsoft

Настройка хранилища разработки в Visual Studio 2010

Разбить на страницы
Показывать лекцию целиком

Запуск хранилища разработки

Рассмотрим более подробно работу с Storage Emulator. По умолчанию Storage Emulator устанавливается в папку devstore подкаталога bin, папки Windows Azure SDK.

(рис 14.1)

Здесь можно найти два .exe файла:

1. DSInit - инициализирует локальное хранилище и устанавливает права доступа к нему. Запустив этот файл, при отсутствии ошибок, должно появиться следующее окно:

(рис 14.2)

Как видно, была создана локальная база данных для разработки, и зарезервированы порты 10000-10002. В том, что база создана можно также убедиться, запустив SQL Management Studio

(рис 14.3)

2. DSService.exe - непосредственно запускает эмулятор облачного хранилища. Запустив его и подождав некоторое время, можно заметить, что в правом нижнем углу появился значок Windows Azure. Для того, чтобы открыть интерфейс эмулятора, нужно щелкнуть правой кнопкой мыши по значку Windows Azure и выбрать "Show Compute Emulator UI". При отсутствии ошибок, должно появиться следующее окно:

(рис 14.4)

В окне Storage Emulator отображается состояние и конечные точки сервисов эмулятора: Blob, Queue и Table. Сервисы можно запустить, остановить, либо сбросить, с потерей данных, хранящихся в них.

Важно отследить следующий момент: порты, указанные для каждого из сервисов должны быть свободны. В случае, если при запуске хранилища разработки вы видите следующую ошибку:

(рис 14.5)

Это скорее всего означает, что указанные порты "слушают" другие приложения. К примеру, как отмечалось в ряде источников и было проверено нами, клиент mtorrent, запущенный до старта эмулятора конфликтует с Blob - сервисом, из-за чего к последнему не удается получить доступ.

Подключение к хранилищу разработки

Для подключения к эмулятору хранилища при разработке приложения (в среде Visual Studio в нашем случае) после создания проекта необходимо перейти к свойствам роли

(рис 14.6)

А затем во вкладке "Параметры" добавить параметр строки подключения и указать значение "UseDevelopmentStorage=true"

(рис 14.7)

При работе непосредственно с хранилищем Windows Azure, в той же вкладке необходимо, при создании строки подключения, нажать кнопку "..."

(рис 14.8)

И в появившемся окне задать параметры подключения и используемой учетной записи Windows Azure.

(рис 14.9)

Запустив Обозреватель серверов (Меню "Вид" - Обозреватель серверов), увидим появившееся хранилище Windows Azure и хранилище "Разработка" - являющееся отображением эмулятора.

(рис 14.10)

При помощи обозревателя серверов можно просматривать содержимое конкретных таблиц или контейнеров бинарных объектов.

(рис 14.11)

Также при помощи обозревателя серверов можно подключиться к хранилищу Windows Azure, добавив данные учетной записи.

(рис 14.12)

Для того, чтобы продемонстрировать подключение к хранилищу данных, рассмотри небольшой пример, по созданию хранилища с простой структурой - это будет таблица - список юридических лиц.

Задание. Создание хранилища с простой структурой данных.

1. Создадим проект облачной службы. SimpleDataStructure (Меню "Файл" - Создать - Проект). Добавим решению рабочую роль.

(рис 14.13)

Наше приложение будет подключаться к эмулятору хранилища, создавать таблицу Firm, если ее не существует и добавлять туда одну произвольную запись.

В свойствах рабочей роли определим строку подключения к эмулятору хранилища Azure.

(рис 14.14)

Нам необходим класс, который будет описывать структуру сущности для нашей таблицы. Класс должен быть наследником Microsoft.WindowsAzure.StorageClient.TableServiceEntity

class Address : TableServiceEntity
        {
            public String address { get; set; }
            public String firm { get; set; }
            public String telephone { get; set; }
        }

Для создания таблиц необходимо определить класс - контекст, при чем:

класс должен быть наследником TableServiceContext

Для каждой таблицы необходимо определить свойство типа IQueryable, где значение параметра DataItemType - тип сущностей, хранимых в таблице, в нашем случае - Address.

class AddressConext: TableServiceContext
        {
            public IQueryable<Address> ContactData
            {
                get
                {
                    return this.CreateQuery<Address>("Address");

                }
            }
            public AddressConext(Uri baseAddress, StorageCredentials credentials) : base(baseAddress.AbsoluteUri, credentials) { }
        }

Теперь обратим внимание на методы Run и OnStart. Первый содержит код выполняемый в ходе работы роли, второй - при ее запуске.

Для того, чтобы добавить данные в таблицу нам необходимо в методе Run:

  • создать экземпляр класса - учетной записи
  • создать экземпляр класс - контекста
  • создать экземпляр класса - сущности и задать его параметры
  • создать таблицу Address, если она не существует
  • добавить сущность в таблицу
  • Добавим следующий код:

    CloudStorageAccount.SetConfigurationSettingPublisher(
                    (configName, configSettingPublisher) =>
                    {
                        var connectionString =
                            RoleEnvironment.GetConfigurationSettingValue(configName);
                        configSettingPublisher(connectionString);
                    }
                );
    //определение учетной записи
                CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
                
                //создание таблицы Windows Azure Table
                CloudTableClient _tc = null;
                _tc = account.CreateCloudTableClient();
                _tc.CreateTableIfNotExist("Address");
    /*определение сущности, в том числе свойств ключ строки и ключ секции, унаследованных от родительского TableServiceEntity*/
                Address adrs = new Address();
                adrs.PartitionKey = "Firm";
                adrs.RowKey = "Test entity";
                adrs.telephone = "xxx-xx-xx";
                adrs.address = "Evergreen Terrace 247";
                adrs.firm = "My new firm";
    //определение контекста
                AddressConext context = new AddressConext(account.TableEndpoint, account.Credentials);
    //добавление сущности таблице Address
                context.AddObject("Address", adrs);
    //сохранение изменений
                context.SaveChanges();

    Запустите приложение, убедитесь в том, что оно выполнилось без ошибок и остановите его.

    В диспетчере серверов, во вкладке "Хранилище Windows Azure" обновите вкладку "Таблицы", вы увидите созданную нашим приложением таблицу Address.

    (рис 14.15)

    Щелкните на таблице правой кнопкой мыши и выберите "Просмотреть данные". Вы увидите, что определенная нами сущность добавлена в таблицу.

    (рис 14.16)

    Более подробно работа с Хранилищем Windows Azure будет рассмотрена в последующих практических работах.

    В случае, если выполнение задания вызвало сложности и затруднения, в приложениях к данной практической работе вы найдете итоговый программный код.

    Список вспомогательных материалов

  • http://www.michaelfcollins3.me/2010/07/creating-table-storage-entities-for-windows-azure/
  • Приложение WorkerRole1.cs

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Net;
    using System.Threading;
    using Microsoft.WindowsAzure;
    using Microsoft.WindowsAzure.Diagnostics;
    using Microsoft.WindowsAzure.ServiceRuntime;
    using Microsoft.WindowsAzure.StorageClient;
    using System.Data.Services.Client;
    
    namespace WorkerRole1
    {
        public class WorkerRole : RoleEntryPoint
        {
            public override void Run()
            {
                CloudStorageAccount.SetConfigurationSettingPublisher(
                    (configName, configSettingPublisher) =>
                    {
                        var connectionString =
                            RoleEnvironment.GetConfigurationSettingValue(configName);
                        configSettingPublisher(connectionString);
                    }
                );
                CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
                //создание таблицы Windows Azure Table
                CloudTableClient _tc = null;
                _tc = account.CreateCloudTableClient();
                _tc.DeleteTableIfExist("Address");
                _tc.CreateTableIfNotExist("Address");
    
                Address adrs = new Address();
                adrs.PartitionKey = "Firm";
                adrs.RowKey = "Test entity";
                adrs.telephone = "xxx-xx-xx";
                adrs.address = "Evergreen Terrace 247";
                adrs.firm = "My new firm";
    
                AddressConext context = new AddressConext(account.TableEndpoint, account.Credentials);
                context.AddObject("Address", adrs);
                context.SaveChanges();
            }
    
            public override bool OnStart()
            {
                ServicePointManager.DefaultConnectionLimit = 12;
                return base.OnStart();
            }
            class Address : TableServiceEntity
            {
                public String address { get; set; }
                public String firm { get; set; }
                public String telephone { get; set; }
            }
            class AddressConext: TableServiceContext
            {
                public IQueryable<Address> ContactData
                {
                    get
                    {
                        return this.CreateQuery<Address>("Address");
                    }
                }
                public AddressConext(Uri baseAddress, StorageCredentials credentials) : base(baseAddress.AbsoluteUri, credentials) { }
            }
        }
    }
    Страницы:

    Запуск хранилища разработки

    Рассмотрим более подробно работу с Storage Emulator. По умолчанию Storage Emulator устанавливается в папку devstore подкаталога bin, папки Windows Azure SDK.

    (рис 14.1)

    Здесь можно найти два .exe файла:

    1. DSInit - инициализирует локальное хранилище и устанавливает права доступа к нему. Запустив этот файл, при отсутствии ошибок, должно появиться следующее окно:

    (рис 14.2)

    Как видно, была создана локальная база данных для разработки, и зарезервированы порты 10000-10002. В том, что база создана можно также убедиться, запустив SQL Management Studio

    (рис 14.3)

    2. DSService.exe - непосредственно запускает эмулятор облачного хранилища. Запустив его и подождав некоторое время, можно заметить, что в правом нижнем углу появился значок Windows Azure. Для того, чтобы открыть интерфейс эмулятора, нужно щелкнуть правой кнопкой мыши по значку Windows Azure и выбрать "Show Compute Emulator UI". При отсутствии ошибок, должно появиться следующее окно:

    (рис 14.4)

    В окне Storage Emulator отображается состояние и конечные точки сервисов эмулятора: Blob, Queue и Table. Сервисы можно запустить, остановить, либо сбросить, с потерей данных, хранящихся в них.

    Важно отследить следующий момент: порты, указанные для каждого из сервисов должны быть свободны. В случае, если при запуске хранилища разработки вы видите следующую ошибку:

    (рис 14.5)

    Это скорее всего означает, что указанные порты "слушают" другие приложения. К примеру, как отмечалось в ряде источников и было проверено нами, клиент mtorrent, запущенный до старта эмулятора конфликтует с Blob - сервисом, из-за чего к последнему не удается получить доступ.

    Подключение к хранилищу разработки

    Для подключения к эмулятору хранилища при разработке приложения (в среде Visual Studio в нашем случае) после создания проекта необходимо перейти к свойствам роли

    (рис 14.6)

    А затем во вкладке "Параметры" добавить параметр строки подключения и указать значение "UseDevelopmentStorage=true"

    (рис 14.7)

    При работе непосредственно с хранилищем Windows Azure, в той же вкладке необходимо, при создании строки подключения, нажать кнопку "..."

    (рис 14.8)

    И в появившемся окне задать параметры подключения и используемой учетной записи Windows Azure.

    (рис 14.9)

    Запустив Обозреватель серверов (Меню "Вид" - Обозреватель серверов), увидим появившееся хранилище Windows Azure и хранилище "Разработка" - являющееся отображением эмулятора.

    (рис 14.10)

    При помощи обозревателя серверов можно просматривать содержимое конкретных таблиц или контейнеров бинарных объектов.

    (рис 14.11)

    Также при помощи обозревателя серверов можно подключиться к хранилищу Windows Azure, добавив данные учетной записи.

    (рис 14.12)

    Для того, чтобы продемонстрировать подключение к хранилищу данных, рассмотри небольшой пример, по созданию хранилища с простой структурой - это будет таблица - список юридических лиц.

    Задание. Создание хранилища с простой структурой данных.

    1. Создадим проект облачной службы. SimpleDataStructure (Меню "Файл" - Создать - Проект). Добавим решению рабочую роль.

    (рис 14.13)

    Наше приложение будет подключаться к эмулятору хранилища, создавать таблицу Firm, если ее не существует и добавлять туда одну произвольную запись.

    В свойствах рабочей роли определим строку подключения к эмулятору хранилища Azure.

    (рис 14.14)

    Нам необходим класс, который будет описывать структуру сущности для нашей таблицы. Класс должен быть наследником Microsoft.WindowsAzure.StorageClient.TableServiceEntity

    class Address : TableServiceEntity
            {
                public String address { get; set; }
                public String firm { get; set; }
                public String telephone { get; set; }
            }

    Для создания таблиц необходимо определить класс - контекст, при чем:

    класс должен быть наследником TableServiceContext

    Для каждой таблицы необходимо определить свойство типа IQueryable, где значение параметра DataItemType - тип сущностей, хранимых в таблице, в нашем случае - Address.

    class AddressConext: TableServiceContext
            {
                public IQueryable<Address> ContactData
                {
                    get
                    {
                        return this.CreateQuery<Address>("Address");
    
                    }
                }
                public AddressConext(Uri baseAddress, StorageCredentials credentials) : base(baseAddress.AbsoluteUri, credentials) { }
            }

    Теперь обратим внимание на методы Run и OnStart. Первый содержит код выполняемый в ходе работы роли, второй - при ее запуске.

    Для того, чтобы добавить данные в таблицу нам необходимо в методе Run:

  • создать экземпляр класса - учетной записи
  • создать экземпляр класс - контекста
  • создать экземпляр класса - сущности и задать его параметры
  • создать таблицу Address, если она не существует
  • добавить сущность в таблицу
  • Добавим следующий код:

    CloudStorageAccount.SetConfigurationSettingPublisher(
                    (configName, configSettingPublisher) =>
                    {
                        var connectionString =
                            RoleEnvironment.GetConfigurationSettingValue(configName);
                        configSettingPublisher(connectionString);
                    }
                );
    //определение учетной записи
                CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
                
                //создание таблицы Windows Azure Table
                CloudTableClient _tc = null;
                _tc = account.CreateCloudTableClient();
                _tc.CreateTableIfNotExist("Address");
    /*определение сущности, в том числе свойств ключ строки и ключ секции, унаследованных от родительского TableServiceEntity*/
                Address adrs = new Address();
                adrs.PartitionKey = "Firm";
                adrs.RowKey = "Test entity";
                adrs.telephone = "xxx-xx-xx";
                adrs.address = "Evergreen Terrace 247";
                adrs.firm = "My new firm";
    //определение контекста
                AddressConext context = new AddressConext(account.TableEndpoint, account.Credentials);
    //добавление сущности таблице Address
                context.AddObject("Address", adrs);
    //сохранение изменений
                context.SaveChanges();

    Запустите приложение, убедитесь в том, что оно выполнилось без ошибок и остановите его.

    В диспетчере серверов, во вкладке "Хранилище Windows Azure" обновите вкладку "Таблицы", вы увидите созданную нашим приложением таблицу Address.

    (рис 14.15)

    Щелкните на таблице правой кнопкой мыши и выберите "Просмотреть данные". Вы увидите, что определенная нами сущность добавлена в таблицу.

    (рис 14.16)

    Более подробно работа с Хранилищем Windows Azure будет рассмотрена в последующих практических работах.

    В случае, если выполнение задания вызвало сложности и затруднения, в приложениях к данной практической работе вы найдете итоговый программный код.

    Список вспомогательных материалов

  • http://www.michaelfcollins3.me/2010/07/creating-table-storage-entities-for-windows-azure/
  • Приложение WorkerRole1.cs

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Net;
    using System.Threading;
    using Microsoft.WindowsAzure;
    using Microsoft.WindowsAzure.Diagnostics;
    using Microsoft.WindowsAzure.ServiceRuntime;
    using Microsoft.WindowsAzure.StorageClient;
    using System.Data.Services.Client;
    
    namespace WorkerRole1
    {
        public class WorkerRole : RoleEntryPoint
        {
            public override void Run()
            {
                CloudStorageAccount.SetConfigurationSettingPublisher(
                    (configName, configSettingPublisher) =>
                    {
                        var connectionString =
                            RoleEnvironment.GetConfigurationSettingValue(configName);
                        configSettingPublisher(connectionString);
                    }
                );
                CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
                //создание таблицы Windows Azure Table
                CloudTableClient _tc = null;
                _tc = account.CreateCloudTableClient();
                _tc.DeleteTableIfExist("Address");
                _tc.CreateTableIfNotExist("Address");
    
                Address adrs = new Address();
                adrs.PartitionKey = "Firm";
                adrs.RowKey = "Test entity";
                adrs.telephone = "xxx-xx-xx";
                adrs.address = "Evergreen Terrace 247";
                adrs.firm = "My new firm";
    
                AddressConext context = new AddressConext(account.TableEndpoint, account.Credentials);
                context.AddObject("Address", adrs);
                context.SaveChanges();
            }
    
            public override bool OnStart()
            {
                ServicePointManager.DefaultConnectionLimit = 12;
                return base.OnStart();
            }
            class Address : TableServiceEntity
            {
                public String address { get; set; }
                public String firm { get; set; }
                public String telephone { get; set; }
            }
            class AddressConext: TableServiceContext
            {
                public IQueryable<Address> ContactData
                {
                    get
                    {
                        return this.CreateQuery<Address>("Address");
                    }
                }
                public AddressConext(Uri baseAddress, StorageCredentials credentials) : base(baseAddress.AbsoluteUri, credentials) { }
            }
        }
    }
    Вернуться к учебному плану