Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ASP_NET_MVC_4_Framework_s_primerami_na_C_dlya_p

.pdf
Скачиваний:
25
Добавлен:
19.03.2016
Размер:
17.66 Mб
Скачать

Развертывание приложения

В этой главе мы покажем вам, как подготовить приложение к развертыванию и провести развертывание. Существует много различных способов развертывания приложений MVC Framework, есть также много целевых серверов. Вы можете развернуть приложение на машине под управлением Windows Server с запущенными службами IIS, которые вы запускаете и конфигурируете локально; возможно развертывание на удаленном хостинге, который будет конфигурировать службы для вас; все чаще встречается развертывание на облачной инфраструктуре, которая обеспечит все необходимые для вашего приложения ресурсы.

Нам сложно было решить, как создать полезный пример развертывания для этой главы. Мы исключили развертывание напрямую в IIS, потому что конфигурация сервера - процесс долгий и сложный, и большинство разработчиков MVC, которые работают с локальными серверами, оставляют конфигурацию и развертывание IT-группе. Мы также исключили развертывание на управляемом хостинге, потому что каждая компания-провайдер определяет свой процесс развертывания и никто не устанавливает стандарты для хостингов.

Таким образом, все, что нам осталось, - это развертывание на Windows Azure, облачной платформе Microsoft и с хорошей поддержкой приложений MVC. Мы не утверждаем, что Azure подходит для всех вариантов развертывания, но нам нравится, как она работает; используя ее в этой главе, мы сосредоточимся на процессе развертывания, а не будем отвлекаться на вопросы конфигурации. Во время написания этой главы была доступна бесплатная 90-дневная пробная версия Azure (некоторые подписки MSDN тоже включают Azure); следовательно, вы сможете повторить пример этой главы, даже если вы не собираетесь использовать Azure для развертывания своих приложений. Для начала мы покажем вам, как подготовить приложение к развертыванию, и затем перейдем собственно к развертыванию.

Внимание!

Мы рекомендуем вам потренироваться с тестовым приложением и сервером, прежде чем развернуть реальное приложение в производственной среде. Как и любой другой аспект жизненного цикла разработки программного обеспечения, процесс развертывания только выиграет от тестирования. Мы знаем жуткие истории о командах разработчиков, которые уничтожили рабочие приложения из-за чрезмерно поспешной или плохо протестированной процедуры развертывания. Нельзя сказать, что функции развертывания ASP.NET особенно опасны - нет, но любое взаимодействие, которое подразумевает запуск приложения с реальными пользовательскими данными, необходимо тщательно продумать и спланировать.

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

Подготовка приложения для публикации

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

651

Подсказка

Когда мы говорим о развертывании приложения SportsStore, мы имеем в виду проект SportsStore.WebUI. Нам не нужно отдельно развертывать два других проекта, которые мы создали вместе с ним. Вывод проекта SportsStore.Domain включен в проект WebUI, а модульные тесты из проекта SportsStore.UnitTests не

потребуются в рабочем приложении.

Выявляем ошибки представлений

Как мы уже объяснили в главе 18, представления Razor компилируются сервером при запуске приложения, а не когда мы создаем проект в Visual Studio. Как правило, единственный способ обнаружить ошибки компилятора - это систематически обращаться к каждому действию и визуализировать каждое представление. Это утомительная и не всегда успешная техника, особенно если в зависимости от состояния модели визуализируются разные представления.

В проекте можно активировать специальную опцию, которая будет компилировать наши представления и сообщать об ошибках компиляции. Эту функцию нельзя активировать из Visual Studio; откройте файл SportsStore/WebUI/SportsStore.WebUI.csproj в блокноте. Найдите элемент

MvcBuildViews и измените его значение на true, как показано в листинге 26-1.

Листинг 26-1: Активируем опцию MvcBuildViews

...

<PropertyGroup>

... other settings omitted ...

<MvcBuildViews>true</MvcBuildViews>

... other settings omitted ...

</PropertyGroup>

...

Сохраните изменения и вернитесь в Visual Studio, которая предложит вам перезагрузить проект. Теперь, когда вы скомпилируете проект, Visual Studio скомпилирует файлы представлений и сообщит об ошибках. Чтобы продемонстрировать, как это работает, мы добавили ошибку в представление /Views/Product/List.cshtml, как показано в листинге 26-2.

Листинг 26-2: Добавляем ошибку в файл представления

@model SportsStore.WebUI.Models.ProductsListViewModel @{

ViewBag.Title = "Products";

}

@Model.NotARealProperty

@foreach (var p in Model.Products)

{

Html.RenderPartial("ProductSummary", p);

}

<div class="pager"> @Html.PageLinks(Model.PagingInfo,

x => Url.Action("List", new { page = x, category = Model.CurrentCategory })) </div>

Как правило, наша попытка визуализировать свойство не будет отображаться, пока мы не запустим приложение и перейдем по ссылке, которая визуализирует представление List.cshtml. Но, когда

652

опция MvcBuildViewsактивирована, мы увидим сообщение об ошибке во время работы над проектом, как показано на рисунке 26-1.

Рисунок 26-1: Ошибка компилятора из-за проблем в представлении

Эта техника позволяет обнаруживать только ошибки компилятора. Она не видит логических ошибок и не может заменить полноценное тестирование, но в качестве предосторожности ее полезно применять перед развертыванием приложения. Мы не сможем развернуть приложение с ошибкой в представлении, так что мы восстановили его до прежнего состояния, как показано в листинге 26-3.

Листинг 26-3: Удаляем ошибку из представления List.cshtml

@model SportsStore.WebUI.Models.ProductsListViewModel

@{

ViewBag.Title = "Products";

}

@foreach (var p in Model.Products)

{

Html.RenderPartial("ProductSummary", p);

}

<div class="pager">

@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new { page = x, category = Model.CurrentCategory }))

</div>

Подсказка

Вы можете увидеть сообщение о том, что будет ошибкой будет использовать секцию, которая зарегистрирована как allowDefinition='MachineToApplication'

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

Дезактивируем режим отладки

Одним из наиболее важных элементов в файле Web.config, на который вы должны обратить внимание при развертывании приложения, является compilation, как показано в листинге 26-4.

Листинг 26-4: Элемент compilation в Web.config

<system.web>

<httpRuntime targetFramework="4.5" /> <compilation debug="true" targetFramework="4.5" />

653

<authentication mode="Forms">

<forms loginUrl="~/Account/Login" timeout="2880">

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

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

Компилирует каждое представление по запросу, вместо компиляции всех представлений в один прием.

Отключает лимит времени запроса, чтобы мы могли провести много времени в отладчике.

Ограничивает способы кэширования контента браузерами.

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

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

<compilation debug="false" targetFramework="4.5" />

Чаще всего вам не придется выполнять это изменение перед развертыванием, поскольку изменить конфигурацию приложения можно в утилитах развертывания Visual Studio, или значение в файле Web.config будет переопределено конфигурацией сервера приложений IIS.

Тем не менее, если поведение приложения меняется, когда атрибут debug имеет значение false, то после отключения режима отладки необходимо запустить программу тестирования до того, как выполнять развертывание. Вы должны убедиться, что ваши представления визуализируются так, как вы и планировали, и все связки, использующие маркер {version}, указывают на файлы, которые существуют и доступны на сервере.

Удаляем неиспользуемые строки подключения

Чаще всего в процессе развертывания ошибки возникают при настройке соединения с базой данных. Как мы знаем из своего опыта, большинство проблем возникают из-за информации о неиспользуемых базах данных в файлеWeb.config.

Зная, что базы данных проблематичны, разработчики утилит развертывания пытаются автоматизировать процесс настройки баз данных, но они зациклены на конфигурации по умолчанию, которую добавляет в проект Visual Studio. Чтобы избежать этих проблем, можно отредактировать файл Web.config. В листинге 26-5 показаны два варианта настройки соединения для передачи данных в файле Web.config в проекте SportsStore.WebUI. Запись, в которой атрибут name содержит DefaultConnection, была создана Visual Studio; она помогает запустить новый проект, и мы не используем ее в приложении SportsStore. Другую запись - EFDbContext - создали и использовали мы, и она потребуется в развернутом проекте.

Листинг 26-5: Строки подключения в файле Web.config

<configuration>

<configSections>

<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,

EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

654

</configSections>

<connectionStrings>

<add name="DefaultConnection" providerName="System.Data.SqlClient"

connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet- SportsStore.WebUI-20121003232522;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-SportsStore.WebUI- 20121003232522.mdf" />

<add name="EFDbContext"

connectionString="Data Source=(localdb)\v11.0;Initial Catalog=SportsStore;Integrated Security=True"

providerName="System.Data.SqlClient"/>

</connectionStrings>

Вы можете просто закомментировать ненужные соединения, но мы предпочитаем вносить более определенные изменения, потому что мы провели много часов за отладкой проблем развертывания, возникших из-за информации о неиспользуемых подключениях. В листинге 26-6 показано, как мы отредактировали файл Web.config, оставив только запись в EFDbContext.

Листинг 26-6: Удаляем информацию о неиспользуемых подключениях

<configuration>

<configSections>

<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,

EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

</configSections>

<connectionStrings>

<add name="EFDbContext"

connectionString="Data Source=(localdb)\v11.0;Initial Catalog=SportsStore;Integrated Security=True"

providerName="System.Data.SqlClient"/>

</connectionStrings>

Подготовка Windows Azure

После того, как мы подготовили и протестировали приложение, можно подготовить хостинг. Прежде чем использовать Azure, необходимо создать аккаунт на www.windowsazure.com. На момент написания данной книги Microsoft предлагала бесплатные пробные аккаунты; некоторые пакеты MSDN также включают сервисы Azure. Когда вы создадите аккаунт, можно настраивать сервисы Azure, введя свои учетные данные на http://manage.windowsazure.com. Сначала вы увидите главную страницу, как показано на рисунке 26-2.

Рисунок 26-2: Портал Azure

655

Внимание!

На момент написания книги портал Azure работал только с Internet Explorer. Другие браузеры не отображали все всплывающие окна или приложение Silverlight, которое требуется для настройки базы данных.

Создаем сайт и базу данных

Начнем с создания нового сайта и сервиса базы данных. Нажмите на большой плюс в левом нижнем углу окна и выберите Compute - Web Site - Create With Database. Вы увидите форму, как показано на рисунке 26-3.

Подсказка

На момент написания книги был доступен предварительный просмотр для функции Web Site. Чтобы активировать данную функцию, нажмите на ссылку, которая появляется при нажатии на опцию Compute.

Рисунок 26-3: Создаем новый сайт и базу данных

Нужно выбрать URL для нашего приложения. Для бесплатных и базовых сервисов Azure мы сможем выбрать только имена в домене azurewebsites.net. Мы назвали приложение mvc4sportsstore, но вам придется придумать что-то свое, так как для каждого сайта Azure требуется уникальное имя.

Выберите область, в которую вы хотите развернуть приложение, и отметьте опцию Create a new SQL database (в Azure можно использовать MySql, но наше приложение не настроено для работы с ней, поэтому мы выбираем базу данных SQL Server).

В поле DB Connection String Name введите EFDbContext. Приложение SportsStore использует это имя для установки соединения с базой данных, и, используя его в сервисе Azure, мы гарантируем,

656

что код приложения будет работать после развертывания без модификаций. Когда вы заполните форму, нажмите кнопку со стрелкой, чтобы перейти к форме, показанной на рисунке 26-4.

Рисунок 26-4: Настраиваем базу данных

Выберите опцию New SQL Data Server в поле Server и введите имя пользователя и пароль. Мы указали имя sportsstore и создали пароль из букв обоих регистров и цифр, следуя рекомендациям из формы. Запишите ваши имя пользователя и пароль, потому что они понадобятся вам в следующем разделе. Нажмите на кнопку с галочкой, чтобы завершить процесс установки. Azure создаст новый сайт и базу данных, что может занять несколько минут. Когда установка будет завершена, вы будете перенаправлены на главную страницу, где увидите, что в категориях Web Sites и SQL Databases появилось по одному элементу, как показано на рисунке 26-5.

Рисунок 26-5: Результат создания сайта и базы данных

657

Подготовка базы данных к удаленному администрированию

Следующим шагом будет настройка базы данных Azure так, чтобы она следовала той же схеме и содержала те же данные, которые мы использованы в главе 7. Нажмите на ссылку SQL Databases на главной странице Azure и затем выберите запись, которая появляется в таблице SQL Databases (если вы приняли значения по умолчанию, база данных будет называться mvc4sportsstore_db).

Вы увидите подробную информацию о базе данных и ее производительности (о которой ничего не известно, потому что в базе еще нет контента и к ней еще не поступало никаких запросов). Нажмите на ссылку Manage allowed IP addresses в разделе Quick Glance, и вы увидите форму, показанную на рисунке 26-6.

Рисунок 26-6: Активируем доступ к конфигурации в фаерволе

Azure ограничивает доступ к базам данных, чтобы они были доступны только для других сервисов Azure. Нам нужно разрешить доступ нашему рабочему компьютеру, для чего мы нажимаем Add to Allowed IP Addresses и затем – кнопку Save, которая появляется в нижней части окна браузера.

Подсказка

Вам нужно будет добавить IP-адреса всех клиентских компьютеров, с которых вы хотите администрировать базу данных Azure.

Нажмите на ссылку Dashboard в верхней части страницы, а затем - на ссылку, которая отображается под Manage URL. Откроется новое окно браузера и загрузится утилита администрирования базы данных Silverlight.

Подсказка

Если у вас еще нет Silverlight, нужно будет его установить. Браузер предложит вам провести инсталляцию и проведет через процесс установки автоматически.

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

658

Создаем схему

Нашим следующим шагом будет создание схемы для базы данных. Нажмите кнопку Administration и вы увидите в основной части окна браузера элемент, представляющий базу данных, которую мы создали ранее (если вы приняли имя по умолчанию, она будет называться mvc4sportsstore.db).

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

Получаем команды для создания схемы

Мы можем получить необходимые команды SQL из Visual Studio. Откройте окно Database Explorer и раскрывайте его элементы, пока не найдете запись для таблицы Products. Кликните по таблице правой кнопкой мыши и выберите Open Table Definition, как показано на рисунке 26-7.

Рисунок 26-7: Получаем определение таблицы в окне Data Explorer

Откроется редактор для схемы таблицы. В таблице T-SQL вы увидите код SQL, показанный в листинге 26-7.

Листинг 26-7: Операторы для создания таблицы Products

CREATE TABLE [dbo].[Products] ( [ProductID] INT IDENTITY (1, 1) NOT NULL, [Name] NVARCHAR (100) NOT NULL, [Description] NVARCHAR (500) NOT NULL, [Category] NVARCHAR (50) NOT NULL, [Price] DECIMAL (16, 2) NOT NULL, [ImageData] VARBINARY (MAX) NULL, [ImageMimeType] VARCHAR (50) NULL, PRIMARY KEY CLUSTERED ([ProductID] ASC)

);

Скопируйте SQL из Visual Studio, вставьте его в текстовую область в браузере и нажмите кнопку Run в верхней части окна браузера. Через пару секунд вы увидите сообщение Command(s) completed

659

successfully, что свидетельствует о том, что наша база данных Azure содержит базу Product с той же схемой, которую мы определили в приложении SportsStore.

Добавляем данные в таблицу

Теперь, когда мы создали таблицу, мы можем заполнить ее данными о товарах, которые мы использовали в главе 7. Вернитесь к записи Products в окне Database Explorer, кликните по ней правой кнопкой мыши и выберите Show Table Data из контекстного меню. В верхней части открывшегося окна вы найдете кнопку Script, как показано на рисунке 26-8.

Рисунок 26-8: Кнопка Script в окне с информацией о таблице

Откроется новое окно, содержащее другой оператор SQL, показанный в листинге 26-8.

Листинг 26-8: Оператор SQL для добавления данных в таблицу Products

SET IDENTITY_INSERT [dbo].[Products] ON

INSERT INTO [dbo].[Products] ([ProductID], [Name], [Description], [Category], [Price], [ImageMimeType]) VALUES (1, N'Kayak', N'A boat for one person', N'Watersports', CAST(275.00 AS

Decimal(16, 2)), NULL)

INSERT INTO [dbo].[Products] ([ProductID], [Name], [Description], [Category], [Price], [ImageMimeType]) VALUES (2, N'Lifejacket', N'Protective and fashionable', N'Watersports',

CAST(48.95 AS Decimal(16, 2)), NULL)

INSERT INTO [dbo].[Products] ([ProductID], [Name], [Description], [Category], [Price], [ImageMimeType]) VALUES (3, N'Soccer Ball', N'FIFA-approved size and weight', N'Soccer',

CAST(19.50 AS Decimal(16, 2)), NULL)

INSERT INTO [dbo].[Products] ([ProductID], [Name], [Description], [Category], [Price], [ImageMimeType]) VALUES (4, N'Corner Flags', N'Give your playing field a professional touch',

N'Soccer', CAST(34.95 AS Decimal(16, 2)), NULL)

INSERT INTO [dbo].[Products] ([ProductID], [Name], [Description], [Category], [Price], [ImageMimeType]) VALUES (5, N'Stadium', N'Flat-packed 35,000-seat stadium', N'Soccer', CAST(79500.00 AS Decimal(16, 2)), NULL)

INSERT INTO [dbo].[Products] ([ProductID], [Name], [Description], [Category], [Price], [ImageMimeType]) VALUES (6, N'Thinking Cap', N'Improve your brain efficiency by 75%', N'Chess',

CAST(16.00 AS Decimal(16, 2)), N'image/jpeg')

INSERT INTO [dbo].[Products] ([ProductID], [Name], [Description], [Category], [Price], [ImageMimeType]) VALUES (7, N'Unsteady Chair', N'Secretly give your opponent a disadvantage',

N'Chess', CAST(29.95 AS Decimal(16, 2)), NULL)

INSERT INTO [dbo].[Products] ([ProductID], [Name], [Description], [Category], [Price], [ImageMimeType]) VALUES (9, N'Human Chess Board', N'A fun game for the family', N'Chess',

660

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]