Приложение. пример приложения для устранения проблем (создание Real-World облачных приложений с помощью Azure)

Майк Уоссон, Рик Андерсон (, том Dykstra)

Скачайте проект Fix It

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

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

Известные проблемы

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

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

Безопасность

  • Убедитесь, что невозможно назначить задачу несуществующему владельцу.
  • Убедитесь, что вы можете просматривать и изменять только те задачи, которые были созданы или назначены вам.
  • Используйте протокол HTTPS для страниц входа и файлов cookie проверки подлинности.
  • Укажите предельное время для файлов cookie проверки подлинности.

проверка входных данных;

Как правило, в рабочем приложении выполняется дополнительная проверка входных данных, чем в приложении Fix ИТ. Например, размер изображения и размер файла изображения, допустимые для отправки, должны быть ограничены.

Функциональность администратора

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

Обработка сообщений очереди

Обработка сообщений в очереди в ИТ-приложении призвана быть простой, чтобы продемонстрировать рабочий шаблон, ориентированный на очередь, с минимальным объемом кода. Этот простой код не подходит для реального рабочего приложения.

  • Код не гарантирует, что каждое сообщение очереди будет обрабатываться не чаще одного раза. При получении сообщения из очереди существует период времени ожидания, в течение которого сообщение невидимо для других прослушивателей очереди. Если время ожидания истекает до удаления сообщения, сообщение снова становится видимым. Таким образом, если экземпляр рабочей роли тратит длительное время на обработку сообщения, то такое же сообщение может быть обработано дважды, что приведет к дублированию задачи в базе данных. Дополнительные сведения об этой ошибке см. в статье Использование очередей службы хранилища Azure.
  • Логика опроса очереди может быть более экономичной, при этом выполняется пакетирование извлечения сообщений. Каждый раз при вызове CloudQueue. GetMessageAsyncвзимается транзакция. Вместо этого можно вызвать метод CloudQueue. жетмессажесасинк (Обратите внимание на ")", который получает несколько сообщений в одной транзакции. Затраты на транзакции для очередей службы хранилища Azure очень низкие, поэтому в большинстве случаев влияние на затраты не является существенным.
  • Строгий цикл в коде обработки сообщений очереди вызывает сходство ЦП, при котором многоядерные виртуальные машины не используются эффективно. Лучше использовать параллелизм задач для параллельного выполнения нескольких асинхронных задач.
  • Очередь — обработка сообщений имеет только элементарную обработку исключений. Например, код не обрабатывает подозрительные сообщения. (Когда обработка сообщений вызывает исключение, необходимо зарегистрировать ошибку и удалить сообщение, либо Рабочая роль будет пытаться обработать ее снова, и цикл будет продолжаться неограниченно долго.)

Запросы SQL не ограничены

Текущее исправление код ИТ не ограничивает количество строк, которые могут возвращать запросы страниц индекса. При входе большого объема задач в базу данных размер полученных списков может вызвать проблемы с производительностью. Решение заключается в реализации разбиения на страницы. Пример см. в разделе Сортировка, фильтрация и разбиение на страницы с помощью Entity Framework в приложении ASP.NET MVC.

Приложение для устранения проблем использует класс сущности Фикситтаск для передачи информации между контроллером и представлением. Рекомендуется использовать модель представления. Модель предметной области (например, класс сущности Фикситтаск) разработана на основе того, что необходимо для сохраняемости данных, а модель представления может быть разработана для представления данных. Дополнительные сведения см. в статье 12 ASP.NET. рекомендации по MVC.

Приложение для устранения проблем сохраняет загруженные изображения как открытые, то есть все, кто находит URL-адрес, может получить доступ к изображениям. Образы могут быть защищены, а не общедоступными.

Нет скриптов автоматизации PowerShell для очередей

Примеры сценариев автоматизации PowerShell были написаны только для базовой версии исправления, которая полностью работает в веб-приложениях службы приложений Azure. Мы не предоставили скрипты для настройки и развертывания в веб-приложении и среде облачной службы, требуемой для обработки очереди.

Специальная обработка HTML-кодов в вводимых пользователем данных

ASP.NET автоматически предотвращает множество способов, с помощью которых злоумышленники могут попытаться выполнять атаки с использованием межузловых сценариев, вводя сценарии в текстовые поля ввода пользователя. И DisplayFor вспомогательный модуль MVC, используемый для вывода заголовков задач и заметок, автоматически кодирует значения, отправляемые в браузер. Но в рабочем приложении может потребоваться принять дополнительные меры. Дополнительные сведения см. в разделе Проверка запросов в ASP.NET.

Рекомендации

Ниже приведены некоторые проблемы, которые были исправлены после обнаружения в ходе проверки кода и тестирования исходной версии приложения Fix ИТ. Некоторые из них были вызваны тем, что первоначальный программист не знает о конкретной рекомендации, а некоторые просто потому, что код был написан быстро и не предназначался для выпущенного программного обеспечения. Здесь мы перечислением проблем, которые мы узнали из этой проверки и тестирования, которые могут оказаться полезными для других пользователей, которые также разрабатывают веб-приложения.

Удаление репозитория базы данных

FixItTaskRepositoryКласс должен ликвидировать DbContext экземпляр Entity Framework. Мы сделали это путем реализации IDisposable в FixItTaskRepository классе:

public class FixItTaskRepository : IFixItTaskRepository, IDisposable
{
    private MyFixItContext db = new MyFixItContext();

    // other code not shown

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            // Free managed resources.
            if (db != null)
            {
                db.Dispose();
                db = null;
            }
        }
    }
}

Обратите внимание, что AutoFac будет автоматически удалять FixItTaskRepository экземпляр, поэтому нам не нужно явно его удалять.

Другой вариант — удалить DbContext переменную-член из FixItTaskRepository , а вместо этого создать локальную DbContext переменную в каждом методе репозитория внутри using инструкции. Пример:

// Alternate way to dispose the DbContext
using (var db = new MyFixItContext())
{
    fixItTask = await db.FixItTasks.FindAsync(id);
}

Регистрация одноэлементных экземпляров с помощью DI

Поскольку требуется только один экземпляр PhotoService класса и Logger класса, эти классы должны быть зарегистрированы как одиночные экземпляры для внедрения зависимостей в DependenciesConfig.CS:

builder.RegisterType<Logger>().As<ILogger>().SingleInstance();
builder.RegisterType<FixItTaskRepository>().As<IFixItTaskRepository>();
builder.RegisterType<PhotoService>().As<IPhotoService>().SingleInstance();

Безопасность: не показывать сведения об ошибках пользователям

В исходном приложении для ИТ-приложений не была Общая страница ошибки, и можно просто позволить всем исключениям передаваться в пользовательский интерфейс, поэтому некоторые исключения, такие как ошибки подключения к базе данных, могут привести к отображению полной трассировки стека в браузере. Подробные сведения об ошибках иногда могут способствовать атакам злоумышленников. Решением является запись сведений об исключении в журнал и отображение страницы ошибки для пользователя, не включающего в себя подробности ошибки. Приложение для устранения проблем уже записывается в журнал. чтобы отобразить страницу ошибки, мы добавили <customErrors mode=On> в файл Web.config.

<system.web>
  <customErrors mode="On"/>
  <authentication mode="None" />
  <compilation debug="true" targetFramework="4.5" />
  <httpRuntime targetFramework="4.5" />
</system.web>

По умолчанию это приводит к тому, что виевс\шаред\еррор.кштмл будет отображаться для ошибок. Можно настроить Error. cshtml или создать собственное представление страницы ошибок и добавить defaultRedirect атрибут. Для конкретных ошибок можно также указать различные страницы ошибок.

Безопасность: разрешить изменение задачи только создателем

На странице указатель панели мониторинга отображаются только задачи, созданные вошедшим в систему пользователем, но злоумышленник может создать URL-адрес с ИДЕНТИФИКАТОРом для задачи другого пользователя. Мы добавили код в DashboardController.CS , чтобы вернуть 404 в этом случае:

public async Task<ActionResult> Edit(int id)
{
    FixItTask fixittask = await fixItRepository.FindTaskByIdAsync(id);
    if (fixittask == null)
    {
        return HttpNotFound();
    }

    // Verify logged in user owns this FixIt task.
    if (User.Identity.Name != fixittask.Owner)
    {
       return HttpNotFound();
    }

    return View(fixittask);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(int id, [Bind(Include = "CreatedBy,Owner,Title,Notes,PhotoUrl,IsDone")]FormCollection form)
{
    FixItTask fixittask = await fixItRepository.FindTaskByIdAsync(id);

    // Verify logged in user owns this FixIt task.
    if (User.Identity.Name != fixittask.Owner)
    {
       return HttpNotFound();
    }

    if (TryUpdateModel(fixittask, form))
    {
        await fixItRepository.UpdateAsync(fixittask);
        return RedirectToAction("Index");
    }

    return View(fixittask);
}

Не проглотить исключения

Первоначальное приложение для устранения проблем возвращало значение NULL после регистрации исключения, полученного из SQL-запроса:

catch (Exception e)
{
    log.Error(e, "Error in FixItTaskRepository.FindTasksByOwnerAsync(userName={0})", userName);
    return null;
}

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

catch (Exception e)
{
    log.Error(e, "Error in FixItTaskRepository.FindTasksByCreatorAsync(creater={0})", creator);
    throw;
}

Перехватывать все исключения в рабочих ролях

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

Укажите длину строковых свойств в классах сущностей

Чтобы отобразить простой код, исходная версия ИТ-приложения не указывала значения длины для полей сущности Фикситтаск, и в результате они были определены как varchar (max) в базе данных. В результате пользовательский интерфейс принимает практически любой объем входных данных. Задание длины задает ограничения, которые применяются как к пользовательскому вводу на веб-странице, так и к размеру столбца в базе данных:

public class FixItTask
{
    public int FixItTaskId  { get; set; }
    [StringLength(80)]
    public string CreatedBy { get; set; }
    [Required]
    [StringLength(80)]
    public string Owner { get; set; }
    [Required]
    [StringLength(80)]
    public string Title { get; set; }
    [StringLength(1000)]
    public string Notes { get; set; }
    [StringLength(200)]
    public string PhotoUrl { get; set; }
    public bool IsDone      { get; set; }  
}

Помечайте закрытые члены как доступные только для чтения, если их не требуется изменять

Например, в DashboardController классе FixItTaskRepository создается экземпляр, который не должен изменяться, поэтому мы определили его как ReadOnly.

public class DashboardController : Controller
    {
        private readonly IFixItTaskRepository fixItRepository = null;

Использовать список. Any () вместо List. Count () > 0

Если вас интересует, что один или несколько элементов в списке соответствуют указанным критериям, используйте метод ANY , так как он возвращается сразу после того, как элемент подбирает критерий, в то время как Count метод всегда должен выполнять итерацию по каждому элементу. Файл панели мониторинга index. cshtml изначально имел следующий код:

@if (Model.Count() == 0) {
    <br />
    <div>You don't have anything currently assigned to you!!!</div>
}

Мы изменили его на следующее:

@if (!Model.Any()) {
    <br />
    <div>You don't have anything currently assigned to you!!!</div>
}

Создание URL-адресов в представлениях MVC с помощью вспомогательных функций MVC

Для кнопки создать устранить проблему на домашней странице в приложении для ИТ-приложений жестко закодирован элемент привязки:

<a href="/Tasks/Create" class="btn btn-primary btn-large">Create a New FixIt &raquo;</a>

Для ссылок представлений и действий лучше использовать вспомогательный метод HTML URL. Action , например:

@Url.Action("Create","Tasks")

Используйте Task. Delay вместо Thread. Сон в рабочей роли

Шаблон New-Project помещает Thread.Sleep в образец кода для рабочей роли, но в результате поток в спящий режим может повлечь за собой ненужные потоки в пуле потоков. Это можно избежать, используя вместо этого Task. Delay .

while (true)
{
    try
    {
        await queueManager.ProcessMessagesAsync();
    }
    catch (Exception ex)
    {
        logger.Error(ex, "Exception in worker role Run loop.");
    }
    await Task.Delay(1000);
}

Избегайте асинхронного void

Если асинхронному методу не требуется возвращать значение, возвращается Task тип, а не void .

Этот пример относится к FixItQueueManager классу:

// Correct
public async Task SendMessageAsync(FixItTask fixIt) { ... }

// Incorrect
public async void SendMessageAsync(FixItTask fixIt) { ... }

Следует использовать async void только для обработчиков событий верхнего уровня. Если определить метод как async void , вызывающий объект не может ожидать метод или перехватить любые исключения, которые вызывает метод. Дополнительные сведения см. в статье рекомендации по асинхронному программированию.

Использование токена отмены для прерывания работы цикла рабочей роли

Как правило, метод Run в рабочей роли содержит бесконечный цикл. При остановке рабочей роли вызывается метод RoleEntryPoint. OnStop . Этот метод следует использовать для отмены работы, выполняемой внутри метода Run , и корректного выхода. В противном случае процесс может завершиться в середине операции.

Отказаться от автоматического сканирования MIME

В некоторых случаях Internet Explorer сообщает тип MIME, отличный от типа, указанного веб-сервером. Например, если Internet Explorer находит HTML-содержимое в файле, который доставляется с содержимым заголовка HTTP-ответа, Type: text/plain, Internet Explorer определяет, что содержимое должно быть визуализировано как HTML. Увы, это «сканирование MIME» также может привести к проблемам безопасности серверов, на которых размещается ненадежное содержимое. Для борьбы с этой проблемой в Internet Explorer 8 внесено несколько изменений в код определения типа MIME, и разработчики приложений могут отказаться от СКАНИРОВАНИЯ MIME. Следующий код был добавлен в файл Web.config .

<system.webServer>
     <httpProtocol>
        <customHeaders>
           <add name="X-Content-Type-Options" value="nosniff"/>
        </customHeaders>
     </httpProtocol>
     <modules>
      <remove name="FormsAuthenticationModule" />
    </modules>
  </system.webServer>

Включение объединения и минификации

Когда Visual Studio создает новый веб-проект, объединение и минификации файлов JavaScript по умолчанию отключено. Мы добавили строку кода в BundleConfig.cs:

// For more information on bundling, visit https://go.microsoft.com/fwlink/?LinkId=301862
public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                "~/Scripts/jquery-{version}.js"));
 
   // Code removed for brevity/
 
   BundleTable.EnableOptimizations = true;
}

Установка времени ожидания истечения срока действия для файлов cookie проверки подлинности

По умолчанию срок действия файлов cookie для проверки подлинности истекает через две недели. Более короткое время является более безопасным. Этот параметр можно изменить в StartupAuth.CS.

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    ExpireTimeSpan = System.TimeSpan.FromMinutes(20)
});

Запуск приложения из Visual Studio на локальном компьютере

Существует два способа запустить приложение для устранения проблем:

  • Запустите базовое приложение, которое записывает новые задачи непосредственно в базу данных SQL.
  • Запустите приложение, используя очередь и серверную службу, чтобы создать задачи. Шаблон очереди описан в разделе рабочий шаблон, ориентированный на очередь.

Запуск базового приложения

  1. Установите Visual Studio 2017.
  2. Установите пакет Azure SDK для .NET для Visual Studio.
  3. Скачайте ZIP-файл из коллекции кода MSDN.
  4. В проводнике щелкните правой кнопкой мыши ZIP-файл и выберите пункт Свойства, а затем в окно свойств нажмите кнопку Разблокировать.
  5. Распакуйте файл.
  6. Дважды щелкните файл sln, чтобы запустить Visual Studio.
  7. В меню Сервис выберите Диспетчер пакетов NuGet, а затем — консоль диспетчера пакетов.
  8. В консоли диспетчера пакетов (PMC) нажмите кнопку восстановить.
  9. Закройте Visual Studio.
  10. Запустите эмулятор хранения Azure.
  11. Перезапустите Visual Studio, открыв файл решения, который вы закрыли на предыдущем шаге.
  12. Убедитесь, что проект FixIt установлен в качестве запускаемого проекта, и нажмите клавиши CTRL + F5, чтобы запустить проект.

Запуск приложения с обработкой очереди

  1. Следуйте указаниям по запуску базового приложения, а затем закройте браузер и закройте Visual Studio.

  2. Запустите Visual Studio с правами администратора. (Вы будете использовать эмулятор вычислений Azure, для которого требуются права администратора).

  3. В файле Web.config приложения в проекте мификсит (веб-проекте) измените значение appSettings/UseQueues на "true":

    <appSettings>
        <!-- Other settings not shown -->
        <add key="UseQueues" value="true"/>
    </appSettings>
    
  4. Если эмулятор хранения Azure еще не запущен, запустите его снова.

  5. Одновременно запустите веб-проект FixIt и проект Мификситклаудсервице.

    С помощью Visual Studio:

    1. Нажмите клавишу F5 , чтобы запустить проект Fixit.
    2. В Обозреватель решений щелкните правой кнопкой мыши проект мификситклаудсервице и выберите Отладка > запустить новый экземпляр.

    Использование Visual Studio 2013 Express для Web:

    1. В обозреватель решений щелкните правой кнопкой мыши решение FixIt и выберите пункт Свойства.

    2. Выберите Несколько запускаемых проектов.

    3. В раскрывающемся списке действие в разделе Мификсит and Мификситклаудсервице выберите Start.

    4. Нажмите кнопку ОК.

    5. Нажмите клавишу F5, чтобы запустить оба проекта.

      При запуске проекта Мификситклаудсервице Visual Studio запускает эмулятор вычислений Azure. В зависимости от конфигурации брандмауэра может потребоваться разрешить эмулятор через брандмауэр.

Развертывание базового приложения в веб-приложениях службы приложений Azure с помощью сценариев Windows PowerShell

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

Если вы хотите работать в Azure без использования очередей и внесли изменения для локального выполнения с очередями, убедитесь, что для параметра Усекуеуес appSetting возвращено значение false, прежде чем продолжить выполнение следующих инструкций.

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

  1. Установите консоль Azure PowerShell . Инструкции см. в статье Приступая к работе с командлетами Azure PowerShell.

    Эта настроенная консоль настроена для работы с подпиской Azure. Модуль Azure устанавливается в каталог Program Files и автоматически импортируется при каждом использовании консоли Azure PowerShell.

    Если вы предпочитаете работать в другой основной программе, такой как интегрированная среда сценариев Windows PowerShell, обязательно используйте командлет Import-Module , чтобы импортировать модуль Azure, или используйте команду в модуле Azure, чтобы активировать автоматический импорт модуля.

  2. Запустите Azure PowerShell с параметром Запуск от имени администратора .

  3. Выполните командлет Set-ExecutionPolicy , чтобы задать для политики выполнения Azure PowerShell значение RemoteSigned . Введите Y (да), чтобы завершить изменение политики.

    PS C:\> Set-ExecutionPolicy RemoteSigned
    

    Этот параметр позволяет выполнять локальные сценарии, не имеющие цифровой подписи. (Можно также задать для политики выполнения значение Unrestricted , что приведет к исключению необходимости в последующем разблокировании, но это не рекомендуется в целях безопасности.)

  4. Выполните Add-AzureAccount командлет, чтобы настроить PowerShell с учетными данными для вашей учетной записи.

    PS C:\> Add-AzureAccount
    

    Срок действия этих учетных данных истекает через определенный промежуток времени, и необходимо повторно запустить Add-AzureAccount командлет. При записи этой электронной книги предельное время до истечения срока действия учетных данных составляет 12 часов.

  5. Если у вас несколько подписок, используйте командлет Select-AzureSubscription, чтобы указать подписку, в которой нужно создать тестовую среду.

  6. Импортируйте сертификат управления для той же подписки Azure с помощью Get-AzurePublishSettingsFile Import-AzurePublishSettingsFile командлетов и. Первый из этих командлетов загружает файл сертификата, а во втором — расположение этого файла, чтобы импортировать его. > [!IMPORTANT]

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

    PS C:\Users\username\Documents\Visual Studio 2013\Projects\MyFixIt\Automation> Get-AzurePublishSettingsFile
    PS C:\Users\username\Documents\Visual Studio 2013\Projects\MyFixIt\Automation> Import-AzurePublishSettingsFile "C:\Users
    \username\Downloads\Azure MSDN - Visual Studio Ultimate-12-14-2013-credentials.publishsettings"
    

    Сертификат используется для вызова REST API, который определяет IP-адрес компьютера разработки, чтобы задать правило брандмауэра на сервере базы данных SQL.

  7. Выполните командлет Set-Location (псевдонимы cd , chdir и sl ) для перехода к каталогу, содержащему скрипты. (Они находятся в папке службы автоматизации в папке Fix ИТ Solution.) Если любое из имен каталогов содержит пробелы, укажите путь в кавычках. Например, чтобы перейти к c:\Sample Apps\FixIt\Automation каталогу, можно ввести следующую команду:

    PS C:\> cd "c:\Sample Apps\MyFixIt\Automation"
    
  8. Чтобы разрешить Windows PowerShell выполнять эти сценарии, используйте командлет Unblock-File . (Сценарии заблокированы, так как они были скачаны из Интернета.)

    Warning

    Безопасность. перед запуском Unblock-File в любом скрипте или исполняемом файле откройте файл в блокноте, проверьте команды и убедитесь, что они не содержат вредоносного кода.

    Например, следующая команда запускает Unblock-File командлет для всех скриптов в текущем каталоге.

    PS C:\Sample Apps\FixIt\Automation> Unblock-File -Path .\*.ps1
    
  9. Чтобы создать веб-приложение для базового (без обработки очередей), исправьте приложение ИТ, запустите сценарий создания среды.

    Обязательный Name параметр указывает имя базы данных и используется также для учетной записи хранения, создаваемой сценарием. Имя должно быть глобально уникальным в пределах домена azurewebsites.net. При указании неуникального имени, например Fixit или Test (или даже в примере фикситдемо), New-AzureWebsite командлет завершается с внутренней ошибкой, которая сообщает о конфликте. Сценарий преобразует имя в нижний регистр в соответствии с требованиями к имени для веб-приложений, учетных записей хранения и баз данных.

    Обязательный SqlDatabasePassword параметр указывает пароль для учетной записи администратора, которая будет создана для базы данных SQL. Не включайте в пароль специальные символы XML ( & < > ;). Это ограничение способа написания сценариев, а не ограничения Azure.

    Например, если вы хотите создать веб-приложение с именем "фикситдемо" и использовать пароль администратора SQL Server "Passw0rd1", можно ввести следующую команду:

    PS C:\Sample Apps\FixIt\Automation> .\New-AzureWebsiteEnv.ps1 -Name 
    fixitdemo <required params here>
    

    Имя должно быть уникальным в домене azurewebsites.net, а пароль должен соответствовать требованиям к базе данных SQL для сложности пароля. (Пример Passw0rd1 соответствует требованиям.)

    Обратите внимание, что команда начинается с ". " . Чтобы предотвратить вредоносное выполнение сценариев, Windows PowerShell требует указать полный путь к файлу скрипта при выполнении скрипта. Для указания текущего каталога можно использовать " точку. или укажите полный путь, например:

    PS C:\Temp\FixIt\Automation> C:\Temp\FixIt\Automation\New-AzureWebsiteEnv.ps1 -Name fixitdemo -SqlDatabasePassword Pas$w0rd
    

    Для получения дополнительных сведений о скрипте используйте Get-Help командлет.

    PS C:\Sample Apps\FixIt\Automation> Get-Help -Full .\New-AzureWebsiteEnv.ps1
    

    Detailed Full Parameters Examples Для фильтрации возвращаемой справки можно использовать параметры,, и командлета Get-Help.

    Если сценарий завершается ошибкой или создает ошибки, например "New-AzureWebsite: вызов Set-AzureSubscription и Select-AzureSubscription", возможно, вы не завершили настройку Azure PowerShell.

    После завершения сценария можно использовать портал управления Azure, чтобы просмотреть созданные ресурсы, как показано в главе Автоматизация всех .

  10. Чтобы развернуть проект FixIt в новой среде Azure, используйте скрипт AzureWebsite.ps1 . Пример:

    PS C:\Sample Apps\FixIt\Automation> .\Publish-AzureWebsite.ps1 ..\MyFixIt\MyFixIt.csproj -Launch
    

    После завершения развертывания браузер откроется с исправлением, которое выполняется в Azure.

Устранение неполадок сценариев Windows PowerShell

Наиболее распространенные ошибки, возникающие при выполнении этих сценариев, связаны с разрешениями. Убедитесь, что Add-AzureAccount и Import-AzurePublishSettingsFile выполнены успешно и вы использовали их для той же подписки Azure. Даже если прошло Add-AzureAccount успешно, может потребоваться запустить его снова. Разрешения, добавленные по Add-AzureAccount истечении срока действия через 12 часов.

Ссылка на объект не указывает на экземпляр объекта.

Если скрипт возвращает ошибки, например "ссылка на объект не задана экземпляром объекта", это означает, что Windows PowerShell не удается найти объект для обработки (это исключение null reference), запустите Add-AzureAccount командлет и повторите сценарий.

New-AzureSqlDatabaseServer : Object reference not set to an instance of an object.
At C:\ps-test\azure-powershell-samples-master\WebSite\create-azure-sql.ps1:80 char:19
+ $databaseServer = New-AzureSqlDatabaseServer -AdministratorLogin $UserName -Admi ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [New-AzureSqlDatabaseServer], NullReferenceException
    + FullyQualifiedErrorId : 
Microsoft.WindowsAzure.Commands.SqlDatabase.Server.Cmdlet.NewAzureSqlDatabaseServer

Интерналеррор: произошла внутренняя ошибка на сервере.

New-AzureWebsiteКомандлет возвращает внутреннюю ошибку, если имя не является уникальным в домене azurewebsites.NET. Чтобы устранить эту ошибку, используйте другое значение для имени, которое находится в параметре name New-AzureWebsiteEnv.ps1.

New-AzureWebsite : InternalError: The server encountered an internal error. 
Please retry the request.
At line:1 char:1
+ New-AzureWebsite -Name fixitdemo
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          
: CloseError: (:) [New-AzureWebsite], Exception
+ FullyQualifiedErrorId : 
Microsoft.WindowsAzure.Commands.Websites.NewAzureWebsiteCommand

Перезапуск скрипта

Если необходимо перезапустить сценарий New-AzureWebsiteEnv.ps1 , так как он не был выполнен до вывода сообщения «Script является завершенным», может потребоваться удалить ресурсы, созданные сценарием до его остановки. Например, если скрипт уже создал веб-приложение Контософикситдемо и вы повторно запускаете сценарий с тем же именем, сценарий завершится ошибкой, так как имя уже используется.

Чтобы определить, какие ресурсы сценарий создал перед остановкой, используйте следующие командлеты:

  • Get-AzureWebsite
  • Get-AzureSqlDatabaseServer
  • Get-AzureSqlDatabase: Для выполнения этого командлета передайте имя сервера базы данных по конвейеру Get-AzureSqlDatabase : Get-AzureSqlDatabaseServer | Get-AzureSqlDatabase.

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

  • Get-AzureWebsite -Name <WebsiteName> | Remove-AzureWebsite
  • Get-AzureSqlDatabase -Name <DatabaseName> -ServerName <DatabaseServerName> | Remove-SqlAzureDatabase
  • Get-AzureSqlDatabaseServer | Remove-AzureSqlDatabaseServer

Развертывание приложения с обработкой очереди в веб-приложениях службы приложений Azure и в облачной службе Azure

Чтобы включить очереди, внесите следующее изменение в файл MyFixIt\Web.config. В разделе appSettings измените значение UseQueues на "true":

<appSettings>
    <!-- Other settings not shown -->
    <add key="UseQueues" value="true"/>
</appSettings>

Затем разверните приложение MVC в веб-приложении в службе приложений Azure, как описано выше.

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

Перед развертыванием облачной службы необходимо обновить некоторые файлы конфигурации.

В MyFixIt.WorkerRole\app.config в разделе connectionStrings замените значение appdb строки подключения фактической строкой подключения для базы данных SQL. Строку подключения можно получить на портале. На портале щелкните базы данных SQL - аппдб - Просмотр строк подключения к базе данных SQL для ADO .NET, ODBC, PHP и JDBC. Скопируйте строку подключения ADO.NET и вставьте значение в файл app.config. Замените "{свой _ пароль _ }" паролем базы данных. (Если вы использовали сценарии для развертывания приложения MVC, вы указали пароль базы данных в SqlDatabasePassword параметре скрипта.)

Результат должен выглядеть следующим образом:

<add name="appdb" connectionString="Server=tcp:####.database.windows.net,1433;Database=appdb;User ID=####;Password=####;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" providerName="System.Data.SqlClient" />

В том же файле MyFixIt.WorkerRole\app.config в разделе appSettings замените два значения заполнителя для учетной записи хранения Azure.

<appSettings>
  <add key="StorageAccountName" value="{StorageAccountName}" />
  <add key="StorageAccountAccessKey" value="{StorageAccountAccessKey}" />
</appSettings>

Ключ доступа можно получить на портале. См. раздел Управление учетными записями хранения.

В Мификситклаудсервице\сервицеконфигуратион.Клауд.кскфг замените два значения заполнителей для учетной записи хранения Azure.

<ConfigurationSettings>
    <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" 
             value="DefaultEndpointsProtocol=https;AccountName={StorageAccountName};AccountKey={StorageAccountAccessKey}" />
  </ConfigurationSettings>

Теперь все готово к развертыванию облачной службы. В обозревателе решений щелкните правой кнопкой мыши проект Мификситклаудсервице и выберите опубликовать. Дополнительные сведения см. в разделе "развертывание приложения в Azure", который входит в часть 2 этого руководства.