Freigeben über


Миграция приложений ASP.NET на Windows Azure

Технология ASP.NET обеспечивает поддержку множества предлагаемых поставщиками приложений вариантов реализации управления пользователями и группами, ролями, профилями и сеансами. Большинство поставщиков поставляется в версии, основанной на базе данных SQL, либо использует представление данных, управляемых поставщиками, в оперативной памяти. Примеры Windows Azure включают реализации поставщиков, использующие масштабируемые и надежные службы хранилищ таблиц и BLOB-объектов. Кроме того, поставщики сталкиваются с проблемой веб-приложений, размещенных на различных компьютерах в структуре Windows Azure. Службы хранилища таблиц и BLOB-объектов доступны сразу же при развертывании веб-приложения в центрах обработки данных Windows Azure, благодаря чему доступ к ним из приложения упрощается.

Установка и настройка среды

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

  • Откройте проводник Windows и выберите папку Source практической работы (файлы находятся в Windows Azure Trainink Kit).

  • Щелкните правой кнопкой по файлу Setup.cmd и выберите опцию Run as administrator (Запуск от имени администратора) . Запустится процесс настройки, в рамках которого вы настроите среду и установите фрагменты кода Visual Studio, необходимые для данного практического занятия.

Примечание. Каждое упражнение сопровождается исходным решением упражнения, расположенным в папке Begin (файлы находятся в Windows Azure Trainink Kit), что позволяет выполнять упражнения независимо друг от друга. Обратите внимание, что фрагменты кода, добавляемые во время выполнения упражнения, в исходных решениях отсутствуют, и, возможно, не будут работать, пока упражнение не будет выполнено. Внутри исходного кода для каждого упражнения находится также папка End, в которой содержится решение Visual Studio с кодом, который должен получиться в результате выполнения всех этапов соответствующего упражнения. Если при выполнении данной практической работы потребуется дополнительная помощь, можно использовать эти решения в качестве руководства.

Упражнение 1: перенос веб-приложения в облако

В этом упражнении рассматривается настройка образца приложения корзина покупок, реализованного с помощью ASP.NET, для его запуска в Windows Azure.

Задание 1: подготовка приложения к запуску в Windows Azure

Azure Store — стандартный образец ASP.NET приложения, имитирующий простое коммерческое приложение. Оно представляет собой список, из которого пользователи могут выбирать определенные продукты и добавлять их в свою корзину покупок.

  1. Запустите Visual Studio в режиме повышенных административных привилегий через Start | All Programs | Microsoft Visual Studio 2010 (Пуск | Все программы | Microsoft Visual Studio 2010) , щелкнув правой кнопкой мыши ярлык Microsoft Visual Studio 2010 и выбрав пункт Run as administrator (Запуск от имени администратора) .

  2. Если появится диалоговое окно User Account Control (Управление учетными записями пользователей), нажмите Yes (Да).

  3. В меню File (Файл) выберите пункт Open (Открыть), затем Project/Solution (Проект/решение) . В диалоговом окне Open Project, перейдите к папке Ex1-MovingMVCAppsToAzure\Begin или Ex1-MovingWebAppsToAzure\Begin, вложенной в исходную папку Source практического занятия, выберите файл Begin.sln и нажмите Open.

    Примечание. В зависимости от того, что вам нужно, с помощью этой практической работы вы сможете изучить миграцию на Windows Azure различных типов приложений: MVC-приложений ASP.NET или приложений веб-форм ASP.NET. Процедуры в этом упражнении одинаковы для обоих типов приложений. Выберите наиболее подходящее вам решение.

  4. Затем создайте новый проект облачной службы и добавьте его к решению. В меню File (Файл) выберите пункт Add (Добавить), а затем New Project (Новый проект) . В диалоговом окне Add New Project (Добавить новый проект) разверните пункт Visual C# в списке Add New Project (Добавить новый проект) и выберите Cloud (Облако). Выберите шаблон Windows Azure Project (Проект Windows Azure) , установите имя проекта (Name) — AzureStoreService, сохраните предполагаемое расположение папки с решением и нажмите кнопку OK.

    image

  5. В диалоговом окне New Windows Azure Project (Новый проект Windows Azure) выберите OK, не добавляя новых ролей к решению, поскольку существующее приложение будет использоваться как веб-роль.

    image

  6. Свяжите проект ASP.NET с облачным проектом. В обозревателе решений Solution Explorer щелкните правой кнопкой мыши по узлу Roles (Роли) проекта AzureStoreService, выберите Add (Добавить) , а затем Web Role Project in solution (Новый проект роли в решении).

    image

  7. В диалоговом окне Associate with Role Project (Связать с проектом роли), выберите проект AzureStore и нажмите OK.

    image

    Примечание. При связывании с новой ролью Visual Studio обновляет файлы ServiceDefinition.csdef и ServiceConfiguration.cscfg. Если какой-либо из этих файлов в это время открыт, необходимо сохранить сделанные изменения.

  8. Добавьте ссылку на сборки, необходимые для поддержки среды Azure. В обозревателе решений Solution Explorer щелкните правой кнопкой на проекте AzureStore, выберите Add Reference (Добавить ссылку), щелкните вкладку .NET, выберите компоненты Microsoft.WindowsAzure.Diagnostics, Microsoft.WindowsAzure.ServiceRuntime и Microsoft.WindowsAzure.StorageClient и нажмите OK.

    image

  9. Для подключения диагностического протоколирования приложения настройте TraceListener. Чтобы выполнить настройку, откройте файл Web.config проекта AzureStore и вставьте раздел system.diagnostics как указано (выделено) ниже.

    XML

     <configuration>
      ...
       <system.diagnostics> 
         <trace autoflush="false" indentsize="4"> 
           <listeners> 
             <add name="AzureDiagnostics" type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
           </listeners> 
         </trace> 
       </system.diagnostics> 
    
    </configuration>
    

    Примечание. Такие установки раздела system.diagnostics обеспечивают настройку прослушивателя трассировки для использования с Windows Azure, что позволяет приложению осуществлять трассировку выполнения кода с помощью классов и методов, доступных в классе System.Diagnostics.Trace. Как правило, этот этап можно пропустить при работе с ролями, разработанными в Visual Studio, поскольку все необходимые установки уже включены в их шаблоны.

  10. Объявите следующие пространства имен в файле Global.asax веб-роли.

    C#

     using Microsoft.WindowsAzure; 
    using Microsoft.WindowsAzure.ServiceRuntime; 
    
  11. Затем, чтобы инициализировать издателя параметров конфигурации, найдите метод Application_Start и вставьте следующий (выделенный) код в его начало.

    C#

     void Application_Start(object sender, EventArgs e)
    {
        Microsoft.WindowsAzure.CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) => 
         { 
            configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)); 
         }); 
    
      ...
    }
    

    Примечание. Издатель конфигураций упрощает извлечение параметров конфигурации учетной записи хранения. Приложениям достаточно установить издателя с помощью CloudStorageAccount.SetConfigurationSettingPublisher лишь один раз — после этого, чтобы получить доступ к учетной записи хранения в любой момент с помощью CloudStorageAccount.FromConfigurationSetting, необходимо будет только имя соответствующего параметра.

    Веб-роли могут определять класс WebRole с точкой входа роли. В этом классе содержатся методы, которые Windows Azure вызывает на различных этапах всего существования роли, например метод OnStart, который вызывается во время запуска роли. Этот метод может использоваться для инициализации роли. Однако следует отметить, что для веб-ролей, полностью выполняемых в режиме IIS, веб-приложения размещаются сервером Internet Information Server в отдельном процессе (w3wp.exe), а точка входа роли выполняется в другом процессе (WaIISHost.exe). Следовательно, большинство задач по инициализации веб-ролей должно выполняться в методе Application_Start ASP.NET.

  12. При выполнении MVC проекта ASP.NET необходимо удостовериться, что сборка System.Web.MVC включена в пакет службы, развертывание которой осуществляется в Windows Azure. Для этого разверните узел References (Ссылки) в обозревателе решений Solution Explorer проекта AzureStore, щелкните правой кнопкой мыши сборку System.Web.MVC и выберите пункт Properties (Свойства) . Измените значение параметра Copy Local (Копировать локально) на True.

    image

    Примечание. Обычно в любой сборке, не установленной по умолчанию на виртуальные машины Windows Azure, необходимо установить значение параметра Copy Local = True, чтобы обеспечить ее развертывание с вашим приложением.

    Примечание. В зависимости от типа приложения, на котором выполнялось предыдущее упражнение, можно приступать либо к упражнению 2 «Использование поставщиков Azure ASP.NET с приложениями MVC», либо к упражнению 3 «Использование поставщиков Azure ASP.NET с приложениями веб-формы».

Упражнение 2: использование поставщиков Azure ASP.NET с приложениями MVC

В этом упражнении рассматривается изменение MVC приложения ASP.NET для использования поставщиков ASP.NET из примеров Windows Azure. Упражнение начинается с добавления на сайт системы аутентификации с помощью поставщика членства. Затем применяется поставщик ролей для классификации пользователей и настраиваются продукты, которые будет предлагать приложение. Наконец, осуществляется настройка поставщика состояния сеанса для хранения содержимого корзины.

Задание 1: настройка доступа к приложению с проверкой подлинности

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

  1. Если необходимо, запустите Visual Studio в режиме повышенных административных привилегий через Start | All Programs | Microsoft Visual Studio 2010 (Пуск | Все программы | Microsoft Visual Studio 2010) , щелкнув правой кнопкой мыши по значку Microsoft Visual Studio 2010 и выбрав пункт Run as administrator (Запуск от имени администратора) .

  2. В меню File (Файл) выберите пункт Open (Открыть) , затем Project/Solution (Проект/Решение) . В диалоговом окне Open Project (Открыть проект) перейдите к папке Ex2-UsingAzureProvidersWithMVCApps\Begin, вложенной в исходную папку практического занятия Source, выберите файл Begin.sln и нажмите Open. Кроме того, можно продолжить работу с решением, полученным в ходе выполнения упражнения 1.

  3. Откройте файл HomeController.cs в папке Controllers и отметьте класс атрибутом Authorize (Авторизовать). Эта настройка заставит приложение требовать доступ с проверкой подлинности для всех возможных действий на данном контроллере.

    C#

     [HandleError] 
     [Authorize] 
    public class HomeController : Controller
    {
        ...
    }
    
  4. Сохраните файл HomeController.cs.

Задание 2: настройка поддержки членства с помощью Azure TableStorageMembershipProvider

В этом задании требуется добавить и настроить поставщиков Azure ASP.NET для поддержки состояния сеанса, управления ролями и членством.

1.

Добавьте к решению проект поставщиков Windows Azure ASP.NET. В обозревателе решений **Solution Explorer** щелкните правой кнопкой мыши решение **Begin**, выберите опцию ***Add*** *(Добавить),* а затем команду ***Existing Project*** *(Существующий проект).* Перейдите к **Assets\\AspProviders** в папке **Source** практической работы, выберите файл проекта **AspProviders.csproj** и нажмите **Open *(Открыть)*** .

  
  

**Примечание.** Проект **AspProviders** предоставляется в качестве образца. Он включен в настоящий обучающий пакет для вашего удобства и основан на исходном коде, доступном в коллекции исходных кодов [MSDN Code Gallery](https://code.msdn.microsoft.com/windowsazuresamples). Проект содержит реализацию поставщиков приложений ASP.NET для управления пользователями, ролями, профилями и сеансами.

  
  1. В проекте AspProviders добавьте ссылку на веб-роль. В обозревателе решений Solution Explorer щелкните правой кнопкой мыши по узлу проекта AzureStore и выберите Add Reference (Добавить ссылку) . В диалоговом окне Add Reference (Добавить ссылку) перейдите на вкладку Projects (Проекты) , выберите проект AspProviders и нажмите OK.

    image

  2. Обновите конфигурацию службы таким образом, чтобы она включала строку соединения с Учетной записью хранилища, где будут содержаться данные. Разверните узел Roles (Роли) в проекте AzureStoreService и дважды щелкните узел AzureStore, чтобы открыть окно свойств этой роли.

  3. В окне свойств AzureStore[Role] (AzureStore[Роль]) выберите вкладку Settings (Параметры) и нажмите Add Setting (Добавить параметр) . Установите имя (Name) нового параметра на DataConnectionString и измените тип Type на Connection String. Затем в столбце значений (Value) щелкните кнопку с многоточием.

    image

  4. В диалоговом окне Storage Account Connection String (Строка подключения к учетной записи хранилища) выберите пункт Use the storage emulator (Использование эмулятора хранилища) и нажмите OK.

    image

  5. Нажмите CTRL+S, чтобы сохранить изменения в конфигурации ролей.

  6. Откройте файл Web.config, расположенный в корневой папке проекта AzureStore.

  7. (Необязательно.) Настройте хранение информации учетной записи, которую требуют поставщики ASP.NET в файле конфигурации приложения. Для этого найдите элемент <appSettings>, который должен быть пустым, и замените его следующим (выделенным) блоком конфигурации. При отсутствии appSettings вставьте блок в качестве непосредственного дочернего элемента <configuration>.

    Примечание. Помимо файла конфигурации службы для настройки поставщиков Azure можно использовать файл Web.config самого приложения. Это позволяет размещать приложение вне структуры Azure, но при этом, по-прежнему использовать поставщиков и хранилище Azure ASP.NET. Однако при запуске приложения в среде Windows Azure параметры конфигурации, установленные в файле конфигурации службы для поставщиков ASP.NET, имеют преимущество перед параметрами, установленными в файле Web.config. Использование параметров Windows Azure позволяет избежать необходимости повторного развертывания приложения при смене параметров поставщика.

    XML

     <configuration>
      ...
        <add key="DataConnectionString" value="UseDevelopmentStorage=true"/> 
      </appSettings>
      ...
    </configuration>  
    
  8. В проекте AspProviders настройте приложение на использование поставщика членства. Для этого замените существующий раздел <membership> в элементе <system.web> на следующую (выделенную) конфигурацию.

    Примечание. Шаблон MVC ASP.NET, установленный в Visual Studio по умолчанию, задает параметры конфигурации для AspNetSqlMembershipProvider, использующего для хранения данных SQL Server.

    XML

     <configuration>
      ...
      <system.web>
        ...
        <authentication mode="Forms">
          ...
        </authentication>
         <!-- Membership Provider Configuration --> 
         <membership defaultProvider="TableStorageMembershipProvider" userIsOnlineTimeWindow="20" hashAlgorithmType="HMACSHA256"> 
           <providers> 
             <clear/> 
             <add name="TableStorageMembershipProvider" 
                 type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageMembershipProvider" 
                 description="Membership provider using table storage" 
                 applicationName="AzureStore" 
                 enablePasswordRetrieval="false" 
                 enablePasswordReset="true" 
                 requiresQuestionAndAnswer="false" 
                 minRequiredPasswordLength="1" 
                 minRequiredNonalphanumericCharacters="0" 
                 requiresUniqueEmail="true" 
                 passwordFormat="Hashed"/> 
           </providers> 
         </membership> 
      </system.web>
      ...
    </configuration>
    

    Важно. Перед исполнением решения необходимо удостовериться, что запускаемый проект и стартовая страница установлены. Чтобы установить запускаемый проект, щелкните правой кнопкой мыши по проекту AzureStoreService в обозревателе решений Solution Explorer и выберите пункт Set as StartUp Project (Назначить запускаемым проектом) . Чтобы установить стартовую страницу, щелкните правой кнопкой мыши по проекту AzureStore в обозревателе решений Solution Explorer и выберите пункт Properties. В окне Properties выберите вкладку Web, а в пункте Start Action (Действие при запуске) щелкните по Specific Page (Указанная страница) . При работе с проектом MVC значение этого поля следует оставить пустым.

  9. Чтобы построить и запустить приложение, нажмите F5. При первом запуске приложения может потребоваться процедура инициализации, использующая эмулятор хранения. Если такая процедура запустилась, следует дождаться ее завершения и отследить статус инициализации. Чтобы продолжить, нажмите OK.

    image

  10. Обратите внимание: при запуске приложение перенаправляется на страницу входа, поскольку согласно новым параметрам авторизации доступ к домашнему контроллеру Home controller требует проверки подлинности. Для продолжения необходимо создать учетную запись, поскольку база данных членства изначально пуста. Чтобы перейти к форме регистрации нового пользователя, щелкните Register (Регистрация) на странице входа.

    image

  11. Чтобы создать учетную запись, заполните регистрационную форму и щелкните Register (Регистрация).

    image

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

    image

  13. Чтобы остановить запущенное приложение, закройте окно обозревателя.

Задание 3: настройка поддержки ролей с помощью Azure TableStorageRoleProvider

В этом задании необходимо добавить приложению поддержку ролей с помощью поставщика роли Azure. Чтобы захватить роль пользователя и настроить параметры поставщика роли, необходимо обновить регистрацию. Чтобы показать, как именно используются роли, необходимо обновить страницу продуктов. Список продуктов отфильтруется по типам пользователей.

  1. В операцию запуска необходимо добавить код, который позволит инициализировать роли, поддерживаемые приложением. Благодаря этому коду будет создано две роли: Home и Enterprise, которые смогут использоваться приложением для определения различных типов пользователей. Откройте Global.asax.cs и вставьте следующий (выделенный) код в метод Application_Start.

    C#

     protected void Application_Start()
    {
      ...
      this.LoadProducts();
    
       // Initialize the application roles 
      if (!System.Web.Security.Roles.RoleExists("Home")) 
       { 
        System.Web.Security.Roles.CreateRole("Home"); 
       } 
    
      if (!System.Web.Security.Roles.RoleExists("Enterprise")) 
       { 
        System.Web.Security.Roles.CreateRole("Enterprise"); 
       } 
    }
    
    
    
    
    
    
    
  2. Для того чтобы отфильтровать список продуктов в зависимости от типа пользователя, измените действие Index. Откройте файл HomeController.cs в папке Controllers и вставьте в метод Index следующий (выделенный) код прямо под строку, которая объявляет и инициализирует переменную filteredProducts.

    C#

     public ActionResult Index()
    {
      var products = this.HttpContext.Application["Products"] as List<string>;
      var itemsInSession = this.Session["Cart"] as List<string> ?? new List<string>();
    
      // add all products currently not in session
      var filteredProducts = products.Where(item => !itemsInSession.Contains(item));
    
      //// Add additional filters here
       // filter product list for home users
      if (User.IsInRole("Home")) 
       { 
        filteredProducts = filteredProducts.Where(item => item.Contains("Home")); 
       } 
    
      return View(filteredProducts);
    }
    

    Примечание. Вставленный код добавляет дополнительный фильтр для пользователей роли Home, который выводит только элементы, содержащие текст «Home».

  3. В проекте AspProviders настройте приложение на использование поставщика роли. Для этого в файле Web.config замените существующий раздел <roleManager> в элементе <system.web> на следующую (выделенную) конфигурацию.

    Примечание. Шаблон MVC ASP.NET, установленный в Visual Studio по умолчанию, задает параметры конфигурации для AspNetSqlRoleProvider, который использует для хранения данных SQL Server, а также для AspNetWindowsTokenRoleProvider, который использует Группы Windows.

    XML

     <configuration>
      ...
      <system.web>
        ...
         <!-- RoleManager Provider Configuration --> 
         <roleManager enabled="true" 
                     defaultProvider="TableStorageRoleProvider"  
                     cacheRolesInCookie="true"  
                     cookieName=".ASPXROLES"  
                     cookieTimeout="30"  
                     cookiePath="/"  
                     cookieRequireSSL="false"  
                     cookieSlidingExpiration="true"  
                     cookieProtection="All"> 
           <providers> 
             <clear/> 
             <add name="TableStorageRoleProvider" 
                 type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageRoleProvider" 
                 description="Role provider using table storage" 
                 applicationName="AzureStore" /> 
           </providers> 
         </roleManager> 
        ...
      </system.web>
      ...
    </configuration>
    

     

  4. Чтобы построить и запустить приложение без отладки, нажмите CTRL+F5.

  5. Чтобы перейти к форме регистрации нового пользователя, нажмите кнопку Register (Регистрация) на странице входа. Обратите внимание, что теперь мастер регистрации отображает раздел, где требуется указать роль клиента. Создайте нового пользователя и назначьте ему профиль клиента Home. image

  6. Войдите на страницу в качестве пользователя роли Home и перейдите на страницу продуктов. Обратите внимание: теперь в списке указаны только «домашние» продукты.

    image

  7. Щелкните ссылку Logoff (Выход) в верхнем правом углу окна приложения.

  8. Зарегистрируйте новую учетную запись и назначьте пользователю профиль Enterprise. Обратите внимание, что список отображаемых продуктов отличается от списка, который видит пользователь с профилем Home.

    image

  9. Выберите продукт из списка и щелкните Add item to cart (Добавить элемент в корзину), чтобы добавить его в корзину. Таким образом, повторяя эту процедуру, можно добавить в корзину несколько элементов.

  10. Чтобы посмотреть содержимое корзины покупок, нажмите ссылку Checkout (Выйти). Удостоверьтесь, что выбранные вами элементы находятся в списке.

    image

  11. Не закрывайте окно обозревателя и не покидайте страницу оформления заказа.

  12. Щелкните правой кнопкой мыши по значку эмулятора вычислений, расположенному на панели задач, и выберите Show Compute Emulator UI (Показать пользовательский интерфейс эмулятора вычислений).

  13. В окне Compute Emulator (Эмулятор вычислений) щелкните правой кнопкой мыши узел AzureStoreService и выберите Suspend (Приостановить).

    image

  14. Откройте командное окно в режиме администратора с повышенными разрешениями, для этого в меню Start | All Programs | Accessories | Command Prompt (Пуск | Все программы | Стандартные | Командная строка) правой кнопкой мыши щелкните ярлык Command Prompt (Командная строка) и выберите Run as administrator (Запуск от имени администратора) . Затем введите команду iisreset.

    image

    Примечание. Эти два шага, очистка роли и перезапуск служб IIS, показывают, что может произойти при перезапуске экземпляра роли Windows Azure.

  15. Вернитесь в Compute Emulator (Эмулятор вычислений) и дождитесь, пока служба не будет уничтожена — индикатор экземпляра должен стать фиолетовым. Теперь еще раз перезагрузите экземпляр службы. Для этого щелкните правой кнопкой мыши узел AzureStoreService, выберите пункт Run (Выполнить) и дождитесь запуска службы.

  16. Переключитесь в окно обозревателя, в котором отображается страница оформления заказа, и нажмите Refresh (Обновить) . Обратите внимание, что заказ теперь отображается пустым.

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

  17. Закройте окно обозревателя, чтобы остановить приложение.

Задание 4: настройка поддержки состояния сеанса с помощью Azure TableStorageSessionProvider

Windows Azure может размещать веб-роль на нескольких компьютерах одной структуры. Для такой среды хранение состояния сеанса в памяти не подходит. Поставщик состояния сеанса проекта AspProviders, наоборот, использует хранилище таблиц для размещения сведений о конфигурации сеанса, а хранилище BLOB-объектов для хранения самого состояния сеанса. В этой задаче необходимо настроить приложение на использование поставщика состояния сеанса Azure.

  1. В проекте AspProviders настройте приложение на использование поставщика состояния сеанса. Чтобы выполнить настройку, откройте файл Web.config проекта AzureStore и вставьте следующий (выделенный) блок конфигурации в качестве непосредственного дочернего элемента <system.web>.

    XML

     <configuration>
      ...
      <system.web>
        ...
         <!-- SessionState Provider Configuration --> 
         <sessionState mode="Custom" 
                      customProvider="TableStorageSessionStateProvider"> 
           <providers> 
             <clear/> 
             <add name="TableStorageSessionStateProvider" 
                 type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider" 
                 applicationName="AzureStore" /> 
           </providers> 
         </sessionState> 
        ...
      </system.web>
      ...
    </configuration>
    
  2. Чтобы построить и запустить приложение без отладки, нажмите CTRL+F5.

  3. Войдите в систему и перейдите на страницу продуктов. Выберите один или несколько продуктов из списка и нажмите кнопку Add item to cart (Добавить элемент в корзину), чтобы добавить их в корзину. Повторяя эту процедуру, добавьте в корзину несколько элементов.

  4. Чтобы посмотреть содержимое корзины покупок, нажмите ссылку Checkout (Выйти) . Удостоверьтесь, что выбранные вами элементы находятся в списке.

  5. Не закрывайте окно обозревателя и не покидайте страницу оформления заказа.

  6. Щелкните правой кнопкой мыши по значку эмулятора вычислений, расположенному на панели задач, и выберите Show Compute Emulator UI (Показать пользовательский интерфейс эмулятора вычислений).

  7. В окне Compute Emulator (Эмулятор вычислений) щелкните правой кнопкой мыши узел AzureStoreService и выберите Suspend (Приостановить) . Дождитесь, пока служба не будет уничтожена — индикатор экземпляра должен стать фиолетовым.

  8. Откройте командное окно в режиме администратора с повышенными разрешениями, для этого в меню Start | All Programs | Accessories | Command Prompt (Пуск | Все программы | Стандартные | Командная строка) правой кнопкой мыши щелкните ярлык Command Prompt (Командная строка) и выберите Run as administrator. (Запуск от имени администратора) . Затем введите команду iisreset.

  9. Теперь еще раз перезагрузите экземпляр службы. Для этого щелкните правой кнопкой мыши узел AzureStoreService, выберите пункт Run (Выполнить) и дождитесь запуска службы.

  10. Переключитесь в окно обозревателя, в котором отображается страница оформления заказа, и нажмите Refresh (Обновить) . Обратите внимание, что состав заказа не изменился. Это подтверждает, что поставщик Azure может сохранять данные состояния сеанса между запусками приложения.

  11. Закройте окно обозревателя, чтобы остановить приложение.

Упражнение 3: использование поставщиков Azure ASP.NET с приложениями веб-формы

В этом упражнении вы научитесь изменять приложения веб-форм ASP.NET так, чтобы использовать поставщики ASP.NET из примеров Windows Azure. Упражнение начинается с добавления на сайт системы аутентификации с помощью поставщика членства. Затем применяется поставщик ролей для классификации пользователей и настраиваются продукты, которые будет предлагать приложение. Наконец, осуществляется настройка поставщика состояния сеанса для хранения содержимого корзины.

Задание 1: настройка доступа к приложению с проверкой подлинности

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

1.

Если необходимо, запустите Visual Studio в режиме повышенных административных привилегий через ***Start | All Programs | Microsoft Visual Studio 2010*** *(Пуск | Все программы | Microsoft Visual Studio 2010),* щелкнув правой кнопкой мыши по значку **Microsoft Visual Studio 2010** и выбрав пункт **Run as administrator *(Запуск от имени администратора)*** .

  
  1. В меню File выберите пункт Open, затем Project/Solution. В диалоговом окне Open Project перейдите к папке Ex3-UsingAzureProvidersWithWebApps\Begin, вложенной в исходную папку Source практического занятия, выберите файл Begin.sln и нажмите Open (Открыть) . Кроме того, можно продолжить работу с решением, полученным в ходе выполнения упражнения 1.

  2. Настройте правила авторизации для папки Store таким образом, чтобы она требовала доступ с проверкой подлинности. Чтобы выполнить настройку, откройте файл Web.config проекта AzureStore и вставьте следующий (выделенный) блок конфигурации в качестве непосредственного дочернего элемента <configuration>

    XML

     <?xml version="1.0"?>
    <configuration>
      ...
       <location path="Store"> 
         <system.web>  
           <authorization> 
             <deny users="?"/> 
             <allow users="*"/> 
           </authorization> 
         </system.web> 
       </location> 
    </configuration>
    
  3. Нажмите CTRL+S, чтобы сохранить изменения в файле Web.config.

Задание 2: настройка поддержки членства с помощью Azure TableStorageMembershipProvider

В этом задании требуется добавить и настроить поставщиков Azure ASP.NET для поддержки состояния сеанса, управления ролями и членством.

1.

Добавьте к решению проект поставщиков Windows Azure ASP.NET. В обозревателе решений **Solution Explorer** щелкните правой кнопкой мыши решение **Begin**, выберите опцию **Add**, а затем команду ***Existing Project*** *(Существующий проект).* Перейдите к **Assets\\AspProviders** в папке **Source** практической работы, выберите файл проекта **AspProviders.csproj** и нажмите **Open *(Открыть)*** ***.***

  
  

>   
> 
> **Примечание.** Проект **AspProviders** предоставляется в качестве образца. Он включен в настоящий обучающий пакет для вашего удобства и основан на исходном коде, доступном в коллекции исходных кодов [MSDN Code Gallery](https://code.msdn.microsoft.com/windowsazuresamples). Проект содержит реализацию поставщиков приложений ASP.NET для управления пользователями, ролями, профилями и сеансами.
> 
>   

  
  1. В проекте AspProviders добавьте ссылку на веб-роль. В обозревателе решений Solution Explorer щелкните правой кнопкой мыши по узлу проекта AzureStore и выберите Add Reference (Добавить ссылку) . В диалоговом окне Add Reference (Добавить ссылку) перейдите на вкладку Projects (Проекты), выберите проект AspProviders и нажмите OK.

    image

  2. Обновите конфигурацию службы таким образом, чтобы она включала строку соединения с учетной записью хранилища, где будут содержаться данные. Разверните узел Roles (Роли) в проекте AzureStoreService и дважды щелкните узел AzureStore, чтобы открыть окно свойств этой роли.

  3. В окне свойств AzureStore[Role] выберите вкладку Settings (Параметры) и нажмите Add Setting. Установите имя (Name) нового параметра на DataConnectionString и измените тип Type на Connection String (Строка подключения) . Затем в столбце значений (Value) щелкните кнопку с многоточием.

    image

  4. В диалоговом окне Storage Account Connection String (Использование эмулятора хранилища Windows Azure) выберите пункт Use the Windows Azure storage emulator (Строка подключения к учетной записи хранилища) и нажмите OK.

    image

  5. Нажмите CTRL+S, чтобы сохранить изменения в конфигурации ролей.

  6. Откройте файл Web.config, расположенный в корневой папке проекта AzureStore.

  7. (Необязательно.) Настройте хранения информацию учетной записи, которую требуют поставщики ASP.NET в файле конфигурации приложения. Для этого найдите элемент <appSettings>, который должен быть пустым, и замените его следующим (выделенным) блоком конфигурации. При отсутствии appSettings вставьте блок в качестве непосредственного дочернего элемента <configuration>.

    Примечание. Помимо файла конфигурации службы для настройки поставщиков Azure можно использовать файл Web.config самого приложения. Это позволяет размещать приложение вне структуры Azure, но при этом, по-прежнему использовать поставщиков и хранилище Azure ASP.NET. Однако при запуске приложения в среде Windows Azure параметры конфигурации, установленные в файле конфигурации службы для поставщиков ASP.NET, имеют преимущество перед параметрами, установленными в файле Web.config. Использование параметров Windows Azure позволяет избежать необходимости повторного развертывания приложения при смене параметров поставщика.

    XML

     <configuration>
      ...
       <appSettings> 
         <add key="DataConnectionString" value="UseDevelopmentStorage=true"/> 
       </appSettings> 
      ...
    </configuration>
    
  8. В проекте AspProviders настройте приложение на использование поставщика членства. Для этого замените существующий раздел <membership> в элементе <system.web> на следующую (выделенную) конфигурацию.

    Примечание. Шаблон веб-приложения ASP.NET, установленный в Visual Studio по умолчанию, задает параметры конфигурации для AspNetSqlMembershipProvider, использующего SQL Server для хранения данных.

  9. XML

     <configuration>
      ...
      <system.web>
        ...
        <authentication mode="Forms">
          ...
        </authentication>
    
         <!-- Membership Provider Configuration --> 
         <membership defaultProvider="TableStorageMembershipProvider" userIsOnlineTimeWindow="20" hashAlgorithmType="HMACSHA256"> 
           <providers> 
             <clear/> 
             <add name="TableStorageMembershipProvider" 
             type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageMembershipProvider" 
                 description="Membership provider using table storage" 
                 applicationName="AzureStore" 
                 enablePasswordRetrieval="false" 
                 enablePasswordReset="true" 
                 requiresQuestionAndAnswer="false" 
                 minRequiredPasswordLength="1" 
                 minRequiredNonalphanumericCharacters="0" 
                 requiresUniqueEmail="true" 
                 passwordFormat="Hashed"/> 
           </providers> 
         </membership> 
    
      </system.web>
      ...
    </configuration>
    

    Важно. Перед исполнением решения необходимо удостовериться, что запускаемый проект и стартовая страница установлены. Чтобы установить запускаемый проект, щелкните правой кнопкой мыши по проекту AzureStoreService в обозревателе решений Solution Explorer и выберите пункт Set as StartUp Project (Назначить запускаемым проектом).

    Чтобы установить стартовую страницу, щелкните правой кнопкой мыши по проекту AzureStore в обозревателе решений Solution Explorer и выберите пункт Properties (Свойства) . В окне Properties (Свойства) выберите вкладку Web, а в пункте Start Action (Действие при запуске) щелкните по Specific Page (Указанная страница) . Для проекта веб-формы необходимо установить в этом поле значение Store/Products.aspx.

  10. Чтобы построить и запустить приложение, нажмите F5. При первом запуске приложения может потребоваться процедура инициализации, использующая эмулятор хранения. Если такая процедура запустилась, следует дождаться ее завершения и отследить статус инициализации. Чтобы продолжить, нажмите OK.

    image

  11. Обратите внимание: при запуске приложение перенаправляется на страницу входа, поскольку согласно новым параметрам авторизации доступ к домашнему контроллеру Home controller требует проверки подлинности. Для продолжения необходимо создать учетную запись, поскольку база данных членства изначально пуста. Чтобы перейти к форме регистрации нового пользователя, щелкните Register (Регистрация) на странице входа.

    image

  12. Чтобы зарегистрировать учетную запись, заполните регистрационную форму и щелкните Create User (Создать пользователя).

    image

    После того, как работа мастера будет завершена, приложение выведет на экран сообщение, подтверждающее регистрацию. Чтобы перейти на страницу продуктов, нажмите кнопку Continue (Продолжить) .

    image

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

    image

  14. Чтобы остановить запущенное приложение, закройте окно обозревателя.

Задание 3: настройка поддержки ролей с помощью Azure TableStorageRoleProvider

В этом задании необходимо добавить приложению поддержку ролей с помощью поставщика роли Azure. Чтобы захватить роль пользователя и настроить параметры поставщика роли, необходимо обновить регистрацию. Чтобы показать, как именно используются роли, необходимо обновить страницу продуктов. Список продуктов отфильтруется по типам пользователей.

  1. Обновите процесс регистрации, чтобы получить возможность назначать роль пользователю. В папке Account откройте файл Register.aspx и, чтобы добавить новый шаг в элемент управления CreateUserWizard, вставьте в него следующую (выделенную) разметку.

    ASP.NET

         ...
        <WizardSteps>
             <asp:WizardStep> 
                 <div> 
                    Choose a customer profile:</div> 
                 <asp:RadioButtonList ID="roles" runat="server" RepeatDirection="Vertical" RepeatLayout="Flow" 
                    CssClass="role" /> 
             </asp:WizardStep> 
            <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
            </asp:CreateUserWizardStep>
            <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
            </asp:CompleteWizardStep>
        </WizardSteps>
        ...
    
  2. Добавьте обработчик для события, которое запускается при создании пользователя мастером. Для этого добавьте элементу управления CreateUserWizard атрибут OnCreatedUser и задайте обработчику событий имя OnCreatedUser.

    image

  3. Чтобы открыть фоновый код, щелкните правой кнопкой мыши пункт Register.aspx.cs в Solution Explorer и выберите опцию View Code (Перейти к коду). Чтобы определить обработчик событий OnCreatedUser, вставьте следующий код.

    C#

     protected void OnCreatedUser(object sender, EventArgs e) 
     { 
      var list =   (RadioButtonList)this.CreateUserWizard1.WizardSteps[0].FindControl("roles"); 
    
      System.Web.Security.Roles.AddUserToRole( 
                                 this.CreateUserWizard1.UserName, 
                                 list.SelectedItem.Text); 
     } 
    

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

  4. Чтобы инициализировать элемент управления CreateUserWizard, используя роли, определенные приложением, вставьте следующий выделенный код в тело метода Page_Load.

    C#

     protected void Page_Load(object sender, EventArgs e)
    {
      this.CreateUserWizard1.ContinueDestinationPageUrl = Request.QueryString["ReturnUrl"];
    
      if (!IsPostBack) 
       { 
        var list = (RadioButtonList)this.CreateUserWizard1.WizardSteps[0].FindControl("roles"); 
    
        list.DataSource = System.Web.Security.Roles.GetAllRoles().OrderByDescending(a => a); 
        list.DataBind(); 
    
        if (list.Items.Count > 0) 
         { 
          list.Items[0].Selected = true; 
         } 
       } 
    }
    
  5. В операцию запуска необходимо добавить код, который позволит инициализировать роли, поддерживаемые приложением. Благодаря этому коду будет создано две роли: Home и Enterprise, которые смогут использоваться приложением для определения различных типов пользователей. Откройте Global.asax.cs и вставьте следующий (выделенный) код в метод Application_Start.

    C#

     protected void Application_Start(object sender, EventArgs e)
    {
      ...
      this.LoadProducts();
    
       // Initialize the application roles 
      if (!System.Web.Security.Roles.RoleExists("Home")) 
       { 
        System.Web.Security.Roles.CreateRole("Home"); 
       } 
    
      if (!System.Web.Security.Roles.RoleExists("Enterprise")) 
       { 
        System.Web.Security.Roles.CreateRole("Enterprise"); 
       } 
    }
    
  6. Для того чтобы отфильтровать список продуктов в зависимости от типа пользователя, измените страницу продукта. Откройте файл фонового кода Products.aspx.cs в папке Store и вставьте следующий (выделенный) код в метод Page_Init сразу после строки, содержащей объявление и инициализацию переменной filteredProducts.

    C#

     protected void Page_Init(object sender, EventArgs e)
    {
      var products = this.Application["Products"] as List<string>;
      var itemsInSession = this.Session["Cart"] as List<string> ?? new List<string>();
    
      // add all products currently not in session
      var filteredProducts = products.Where(item => !itemsInSession.Contains(item));
    
      //// Add additional filters here
       // filter product list for home users
      if (User.IsInRole("Home")) 
       { 
        filteredProducts = filteredProducts.Where(item =>  item.Contains("Home")); 
       } 
    
      foreach (var product in filteredProducts)
      {
        this.products.Items.Add(product);
      }
    }
    

    Примечание. Вставленный код добавляет дополнительный фильтр для пользователей роли Home, который выводит только элементы, содержащие текст Home.

  7. В проекте AspProviders настройте приложение на использование поставщика роли. Для этого в файле Web.config замените существующий раздел <roleManager> в элементе <system.web> на следующую (выделенную) конфигурацию.

    Примечание. Шаблон веб-приложения ASP.NET, установленный в Visual Studio по умолчанию, задает параметры конфигурации для AspNetSqlRoleProvider, который использует SQL Server для хранения данных, а также для AspNetWindowsTokenRoleProvider, который использует Группы Windows.

    XML

     <configuration>
      ...
      <system.web>
        ...
         <!-- RoleManager Provider Configuration --> 
        <roleManager enabled="true" 
                     defaultProvider="TableStorageRoleProvider"  
                     cacheRolesInCookie="true"  
                     cookieName=".ASPXROLES"  
                     cookieTimeout="30"  
                     cookiePath="/"  
                     cookieRequireSSL="false"  
                     cookieSlidingExpiration="true"  
                     cookieProtection="All"> 
           <providers> 
             <clear/> 
             <add name="TableStorageRoleProvider" 
                 type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageRoleProvider" 
             description="Role provider using table storage" 
                 applicationName="AzureStore" /> 
           </providers> 
         </roleManager> 
        ...
      </system.web>
      ...
    </configuration>
    
  8. Чтобы построить и запустить приложение без отладки, нажмите CTRL+F5.

  9. Чтобы перейти к форме регистрации нового пользователя, нажмите кнопку Register (Регистрация) на странице входа. Обратите внимание, что теперь мастер регистрации отображает раздел, где требуется указать роль клиента. Создайте нового пользователя и назначьте ему профиль клиента Home.

    image

  10. Войдите на страницу в качестве пользователя роли Home и перейдите на страницу продуктов. Обратите внимание: теперь в списке указаны только «домашние» продукты.

    image

  11. Нажмите ссылку Logout (Выйти) в верхнем правом углу окна приложения.

  12. Зарегистрируйте новую учетную запись и назначьте этому пользователю профиль Enterprise. Обратите внимание, что список отображаемых продуктов отличается от списка, который видит пользователь с профилем Home.

    image

  13. Выберите продукт из списка и щелкните Add item to cart (Добавить элемент в корзину), чтобы добавить его в корзину. Таким образом, повторяя эту процедуру, можно добавить в корзину несколько элементов.

  14. Чтобы посмотреть содержимое корзины покупок, нажмите ссылку Checkout (Выйти) . Удостоверьтесь, что выбранные вами элементы находятся в списке.

    image

  15. Не закрывайте окно обозревателя и не покидайте страницу оформления заказа.

  16. Щелкните правой кнопкой мыши по значку эмулятора вычислений, расположенному на панели задач, и выберите Show Compute Emulator UI (Показать пользовательский интерфейс эмулятора вычислений) .

  17. В окне Compute Emulator (Эмулятор вычислений) щелкните правой кнопкой мыши узел AzureStoreService и выберите Suspend (Приостановить) .

    image

  18. Откройте командное окно в режиме администратора с повышенными разрешениями, для этого в меню Start | All Programs | Accessories | Command Prompt (Пуск | Все программы | Стандартные | Командная строка) правой кнопкой мыши щелкните ярлык Command Prompt (Командная строка) и выберите Run as administrator (Запуск от имени администратора) . Затем введите команду iisreset.

    Примечание. Эти два шага, очистка роли и перезапуск служб IIS, показывают, что может произойти при перезапуске экземпляра роли Windows Azure.

  19. Вернитесь в Compute Emulator (Эмулятор вычислений) и дождитесь, пока служба не будет уничтожена — индикатор экземпляра должен стать фиолетовым. Теперь еще раз перезагрузите экземпляр службы. Для этого щелкните правой кнопкой мыши узел AzureStoreService, выберите пункт Run (Выполнить) и дождитесь запуска службы.

  20. Переключитесь в окно обозревателя, в котором отображается страница оформления заказа, и нажмите Refresh (Обновить) . Обратите внимание, что заказ теперь отображается пустым.

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

  21. Закройте окно обозревателя, чтобы остановить приложение.

Задание 4: настройка поддержки состояния сеанса с помощью Azure TableStorageSessionProvider

Windows Azure может размещать веб-роль на нескольких компьютерах одной структуры. Для такой среды хранение состояния сеанса в памяти не подходит. Поставщик состояния сеанса проекта AspProviders, наоборот, использует хранилище таблиц для размещения сведений о конфигурации сеанса, а хранилище BLOB-объектов для хранения самого состояния сеанса. В этой задаче необходимо настроить приложение на использование поставщика состояния сеанса Windows Azure.

  1. В проекте AspProviders настройте приложение на использование поставщика состояния сеанса. Чтобы выполнить настройку, откройте файл Web.config проекта AzureStore и вставьте следующий (выделенный) блок конфигурации в качестве непосредственного дочернего элемента <system.web>.

    XML

     <configuration>
      ...
      <system.web>
        ...
         <!-- SessionState Provider Configuration --> 
         <sessionState mode="Custom" 
                      customProvider="TableStorageSessionStateProvider"> 
           <providers> 
             <clear/> 
             <add name="TableStorageSessionStateProvider" 
                 type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider" 
                 applicationName="AzureStore" /> 
           </providers> 
         </sessionState> 
        ...
      </system.web>
      ...
    </configuration>
    
  2. Чтобы построить и запустить приложение без отладки, нажмите CTRL+F5.

  3. Войдите в систему и перейдите на страницу продуктов. Выберите один или несколько продуктов из списка и нажмите кнопку Add item to cart (Добавить элемент в корзину) , чтобы добавить их в корзину. Повторяя эту процедуру, добавьте в корзину несколько элементов.

  4. Чтобы посмотреть содержимое корзины покупок, нажмите ссылку Checkout (Выйти) . Удостоверьтесь, что выбранные вами элементы находятся в списке.

  5. Не закрывайте окно обозревателя и не покидайте страницу оформления заказа.

  6. Щелкните правой кнопкой мыши по значку эмулятора вычислений, расположенному на панели задач, и выберите Show Compute Emulator UI.

  7. В окне Compute Emulator (Эмулятор вычислений) щелкните правой кнопкой мыши узел AzureStoreService и выберите Suspend (Приостановить) . Дождитесь, пока служба не будет уничтожена — индикатор экземпляра должен стать фиолетовым.

  8. Откройте командное окно в режиме администратора с повышенными разрешениями, для этого в меню Start | All Programs | Accessories | Command Prompt (Пуск | Все программы | Стандартные | Командная строка) правой кнопкой мыши щелкните ярлык Command Prompt (Командная строка) и выберите Run as administrator (Запуск от имени администратора) . Затем введите команду iisreset.

  9. Теперь еще раз перезагрузите экземпляр службы. Для этого щелкните правой кнопкой мыши узел AzureStoreService, выберите пункт Run (Выполнить) и дождитесь запуска службы.

  10. Переключитесь в окно обозревателя, в котором отображается страница оформления заказа, и нажмите Refresh (Обновить) . Обратите внимание, что состав заказа не изменился. Это подтверждает, что поставщик Azure может сохранять данные состояния сеанса между запусками приложения.

  11. Закройте окно обозревателя, чтобы остановить приложение.

    Примечание. Чтобы развернуть в Windows Azure приложение веб-формы ASP.NET, необходимо настроить стартовую страницу в проекте веб-роли. Для этого откройте файл Web.Config и добавьте следующие строки в конец раздела System.WebServer:

    XML

       <system.webServer>
       . . .
       <defaultDocument>
             <files>
                  <add value="Store/Products.aspx" />
             </files>
       </defaultDocument>
      </system.webServer>
    

Заключение

В этом практическом занятии мы рассмотрели изменения, которые необходимы для запуска существующего приложения ASP.NET в среде Windows Azure. Мы изучили процесс проверки подлинности пользователей, а также использование поставщиков состояния сеанса, ролей и членства, основанных на масштабируемых и надежных службах хранилищ таблиц и BLOB-объектов, которые необходимы для работы с приложениями, запущенными на нескольких компьютерах структуры Windows Azure.