Рис. 27 Выходные данные трассировочного маркера на пограничном сервере CDN

Задача 6. Публикация содержимого по протоколу HTTPS

Во многих веб-приложениях страницы, к которым производится обращение по протоколу HTTPS, часто ссылаются на другое статическое содержимое. В таком случае можно получить выигрыш от использования CDN для доставки, например изображений и таблиц стилей. Однако, если такое содержимое опубликовано по протоколу HTTP, тогда как остальная часть содержимого использует протокол HTTPS, вызовет появление предупреждений безопасности в браузере, что в целом снизит удобство работы для пользователей. Включение протокола HTTPS для конечной точки CDN позволит избежать этой проблемы, обеспечив надежную доставку всего содержимого. В этой задаче рассматривается настройка приложения данной практической работы для использования протокола SSL и его локальный запуск в эмуляторе вычислений в целях наблюдения за предупреждениями безопасности о смешанном содержимом. После этого необходимо будет включить поддержку протокола HTTPS для конечной точки CDN и проверить приложение еще раз, чтобы убедиться в том, что предупреждения больше не выводятся. В обозревателе решений разверните узел Роли в проекте CDNService и дважды щелкните роль CDNSample для открытия окна свойств. Выберите вкладку Конечные точки, найдите конечную точку с именем HttpIn и измените ее Протокол на https. Рис. 28 Включение протокола SSL в веб-роли Примечание. Как правило, чтобы включить протокол SSL для конечной точки роли, необходимо указать сертификат на вкладке Сертификаты и назначить этому сертификату конечную точку HTTPS в разделе Имя SSL-сертификата. В этом случае можно лишь проверить приложение в эмуляторе облака, который использует собственный самозаверяющий сертификат, так что этот шаг можно пропустить. Дополнительные сведения о защите приложений Windows Azure с помощью протокола SSL см. в практической работе Развертывание приложений в Windows Azure данного обучающего набора. Чтобы построить и запустить приложение в эмуляторе облака, нажмите клавишу F5. Обратите внимание, что в браузере отображается предупреждение безопасности относительно сертификата безопасности сайта. Чтобы продолжить, перейдите по ссылке Перейти на веб-сайт (не рекомендуется). Рис. 29 Предупреждение безопасности о ненадежном сертификате Примечание. Эмулятор облака использует свой собственный самозаверяющий сертификат для обеспечения поддержки протокола SSL.  Однако центр сертификации для используемого им сертификата не является доверенным, поэтому выводится предупреждение. Это предупреждение не относится к проблеме, рассматриваемой в этом упражнении, поэтому его можно проигнорировать при локальном тестировании приложения. После перехода на веб-сайт обратите внимание, что браузер отображает предупреждение безопасности о том, что некоторое содержимое на странице, которую вы собираетесь просматривать, было доставлено с помощью протокола отличного от HTTPS. Рис. 30 Предупреждение безопасности о защищенном содержимом Примечание. Риск отображения смешанного содержимого заключается в том, что небезопасная веб-страница или скрипт может иметь доступ к информации из безопасного содержимого. Обратите внимание, что страница обрабатывается неправильно, поскольку не были извлечены таблица стилей и изображения из CDN по протоколу HTTP. Рис. 31 Отсутствующие элементы при просмотре только безопасно доставленного содержимого Обновите страницу повторно и нажмите кнопку Показать все содержимое в предупреждении безопасности. Обратите внимание, что страница отображается правильно, но такой подход вынуждает следовать небезопасной практике. Чтобы выйти из приложения и отключить отладчик, закройте окно браузера. Вернитесь на портал управления, перейдите на вкладку Размещенные службы, учетные данные хранилища и CDN и выберите параметр CDN. На средней панели выберите конечную точку CDN, созданную ранее для учетной записи хранилища, и установите флажок в поле HTTPS на ленте. Рис. 32 Включение поддержки протокола HTTPS для конечной точки CDN После включения поддержки HTTPS необходимо распространить изменения в каждый узел сети доставки содержимого (CDN). Прежде чем продолжить выполнение следующих шагов, подождите как минимум 60 минут либо, если не хотите ждать, перейдите к следующему упражнению, выполнение которого не зависит от наличия протокола HTTPS. Позже можно будет вернуться к этой задаче и завершить ее. Далее откройте файл UrlHelperExtension. cs в папке Helpers проекта CDNSample и найдите метод StaticContent. В строке кода, который формирует URL-адрес ресурса в CDN, измените используемую схему с http на https. Рис. 33 Сопоставление статического содержимого с конечной точкой HTTPS Чтобы перезапустить приложение в эмуляторе вычислений, снова нажмите клавишу F5. Пропустите предупреждение о ненадежном сертификате, которое не связано с рассматриваемым в этой задаче вопросом, и обратите внимание, что на этот раз доступ к домашней странице приложения можно получить без отображения предупреждений безопасности в браузере. Рис. 34 Получение содержимого HTTPS из CDN

Упражнение 2. Управление истечением срока действия кэша и версиями ресурсов

НЕ нашли? Не то? Что вы ищете?
Параметр времени жизни (TTL) для большого двоичного объекта определяет, в течение какого времени пограничный сервер CDN будет возвращать закэшированную копию ресурса, прежде чем запросит новую копию из хранилища больших двоичных объектов. По истечении этого срока следующий запрос заставит CDN-сервер вновь получить ресурс из источника большого двоичного объекта, в результате кэширование будет произведено снова. В этом упражнении рассматривается способ управления временем жизни ресурсов, кэшируемых CDN, и показана методика, позволяющая заставить CDN получать обновленное содержимое из службы больших двоичных объектов всякий раз, когда требуется обновление закэшированного ресурса.

Задача 1. Управление временем существования закэшированного ресурса CDN

В этой задаче выполняется обновление приложения таким образом, чтобы при каждом обращении к домашней странице на отображаемое на этой странице накладывался заголовок с текущим временем, а затем выполнялось сохранение обновленного изображения в хранилище больших двоичных объектов с заданием времени жизни 30 секунд. Чтобы показать, как значение параметра времени жизни (TTL) влияет на ответы из CDN, добавим на страницу второе изображение, источником которого будет являться исходный большой двоичный объект, разрешающий просматривать изображение, извлеченное из службы больших двоичных объектов, и параллельно изображение, возвращенное CDN. Откройте Visual Studio с правами администратора, выбрав Пуск | Все программы | Microsoft Visual Studio 2010, щелкнув правой кнопкой мыши пункт Microsoft Visual Studio 2010 и выбрав команду Запуск от имени администратора. Если откроется диалоговое окно Контроль учетных записей, подтвердите продолжение действия. В меню Файл выберите пункт Открыть, затем щелкните Проект/Решение. В диалоговом окне Открытие проекта в папке Source практической работы выберите Ex2-CDNVersioning\Begin, укажите Begin. sln и нажмите кнопку Открыть. Кроме того, можно перейти к решению, выполненному в ходе предыдущего упражнения. Примечание. Если работа начинается с нового решения, настройте конечную точку CDN в методе расширения StaticContent в файле UrlHelperExtension. cs папки Helpers. Чтобы указать параметры учетной записи хранилища, включая имя вашей учетной записи хранилища и ключ доступа, необходимо обновить строку подключения. Для этого замените заполнители [YOUR-ACCOUNT-NAME] и [YOUR-ACCOUNT-KEY] в файле ServiceConfiguration. cscfg, где [YOUR-ACCOUNT-NAME] — это имя учетной записи в хранилище Windows Azure, а [YOUR-ACCOUNT-KEY] — ключ доступа. Рис. 35 Настройка строки подключения учетной записи хранилища Windows Azure

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

Откройте файл IndexViewModel. cs в папке Models проекта CDNSample и вставьте следующее (выделенное) свойство в класс. (Фрагмент кода — Windows Azure CDN - Ex02 IndexViewModel TTL property) C# public class IndexViewModel {   public double TTL { get; set; } } Откройте файл HomeController. cs в папке Controllers приложения. Добавьте объявление для константы IMAGE_TTL в класс HomeController. (Фрагмент кода — Windows Azure CDN - Ex02 IMAGE_TTL constant) C# [HandleError] public class HomeController : Контроллер {   const int IMAGE_TTL = 30;   ... } Затем вставьте метод SaveImageToStream в этот класс, как показано в следующем фрагменте кода. (Фрагмент кода — Windows Azure CDN - Ex02 SaveImageToStream method) C# [HandleError] public class HomeController : Контроллер {   ...   private void SaveImageToStream(Stream output, string caption)   {   using (FileStream input = System. IO. File. OpenRead(HttpContext. Server. MapPath("~/content/images/Source. jpg")))   {   // наложение заголовка на входное изображение   var image = new Bitmap(input);   using (Graphics graphics = Graphics. FromImage(image))   {   using (Font font = new Font("Tahoma", 11F, FontStyle. Regular))   {   graphics. SmoothingMode = SmoothingMode. AntiAlias;   SizeF size = graphics. MeasureString(caption, font, image. Width);   graphics. DrawString(caption, font, Brushes. White, image. Width - size. Width - 5, 6);   graphics. DrawString(caption, font, Brushes. Black, image. Width - size. Width - 6, 5);   }   }   // сохранение изображения в поток   image. Save(output, ImageFormat. Jpeg);   }   } } Теперь вставьте метод UpdateBlob в класс HomeController, как показано ниже. (Фрагмент кода — Windows Azure CDN - Ex02 UpdateBlob method) C# [HandleError] public class HomeController : Контроллер {   ...   private void UpdateBlob(string caption, double ttl)   {   // считывание параметров конфигурации учетной записи   var storageAccount = CloudStorageAccount. FromConfigurationSetting("DataConnectionString");   var blobStorage = storageAccount. CreateCloudBlobClient();   CloudBlockBlob dstBlob = blobStorage. GetBlockBlobReference("content/images/Destination. jpg");   using (BlobStream output = dstBlob. OpenWrite())   {   SaveImageToStream(output, caption);   }   // сохранение в большой двоичный объект и задание его времени жизни   dstBlob. Properties. ContentType = "image/jpeg";   dstBlob. Properties. CacheControl = "public, max-age=" + ttl. ToString("N0");   dstBlob. SetProperties();   } } Примечание. Метод UpdateBlob накладывает заголовок на исходное изображение вместе с текущим временем. Затем этот метод помещает обновленное изображение обратно в хранилище больших двоичных объектов, устанавливая его заголовок Cache-Control, определяя время жизни больших двоичных объектов в течение 30 секунд. Обратите внимание, что значение времени жизни установлено чрезвычайно низким для проверки истечения срока его действия. Чтобы ощутить преимущества CDN, время жизни должно быть, как правило, значительно больше. Найдите действие Index и замените его текст следующим (выделенным) кодом. (Фрагмент кода — Windows Azure CDN - Ex02 Index action) C# [HandleError] public class HomeController : Контроллер {   const int IMAGE_TTL = 30;   public ActionResult Index()   {   UpdateBlob(DateTime. Now. ToLongTimeString(), IMAGE_TTL);   DateTime lastRefreshed = (DateTime)(HttpContext. Application["LastRefreshed"] ?? DateTime. MinValue);   DateTime currentTime = DateTime. Now;   double age = btract(lastRefreshed).TotalSeconds;   if (age > IMAGE_TTL)   {   HttpContext. Application["LastRefreshed"] = currentTime;   age = 0;   }   IndexViewModel model = new IndexViewModel()   {   TTL = IMAGE_TTL - age   };   return View(model);   } } Примечание. Вставленный код вызывает метод UpdateBlob для наложения текущего времени на исходное изображение и сохранения результата обратно в большой двоичный объект. Затем метод оценивает Время жизни (TTL) ресурса в кэше CDN, сохраняя отметку времени, где записывается время выполнения последнего обновления страницы пользователем. Каждый раз после истечения времени жизни ресурса этот метод сбрасывает расчетное значение и обновляет отметку времени LastRefreshed до текущего времени. Откройте файл UrlHelperExtension. cs в папке Helpers проекта CDNSample и добавьте следующий (выделенный) метод в класс. (Фрагмент кода — Windows Azure CDN - Ex02 BlobStorageContent Helper Method) C# public static class UrlHelperExtension {   ...   public static string BlobStorageContent(this UrlHelper helper, string resource)   {   return "http://"   + Microsoft. WindowsAzure. CloudStorageAccount. FromConfigurationSetting("DataConnectionString").BlobEndpoint. Authority   + (Microsoft. WindowsAzure. CloudStorageAccount. FromConfigurationSetting("DataConnectionString").BlobEndpoint. IsLoopback? "/devstoreaccount1" : "")   + "/content/"   + resource;   }   ... } Примечание. BlobStorageContent является вспомогательным методом, который формирует URL-адрес для статического ресурса в службе больших двоичных объектов. Откройте представление Index. aspx в папке Views\Home. Найдите элемент управления заполнителем Content2 и вставьте следующий (выделенный) блок скрипта непосредственно под открывающим тегом, как показано ниже. (Фрагмент кода — Windows Azure CDN - Ex02 DisplayTTL script) HTML <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">   <script type="text/javascript">   $(document).ready(function () {   var ttl = <%= Model. TTL. ToString(System. Globalization. CultureInfo. InstalledUICulture) %>;   var timer = window. setInterval(function () {   if (ttl >= 0) {   $('#ttl').text(ttl. toFixed(1) + ' seconds');   }   else {   $('#ttl').addClass('expired').text('Cache expired!');   window. clearInterval(timer);   }   --ttl;   }, 1000);   });   </script>   <table>   ...   </table>   </asp:Content> Примечание. Вставленный скрипт реализует таймер обратного отсчета, который оценивает оставшееся до истечения время жизни. Далее найдите элемент table в элементе управления заполнителем Content2 и вставьте две дополнительные строки, как показано в следующем (выделенном) фрагменте кода. (Фрагмент кода — Windows Azure CDN - Ex02 Source Image) HTML <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">   <script type="text/javascript">   ...   </script>   <table>   <tr>   <% Html. RenderPartial("ImageUserControl", Url. StaticContent("images/Destination. jpg")); %>   </tr>   <tr>   <% Html. RenderPartial("ImageUserControl", Url. BlobStorageContent("images/Destination. jpg")); %>   </tr>   <tr>   <td></td>   <td class="content"><dl><dt>Estimated TTL</dt><dd id="ttl">&nbsp;</dd></dl></td>   </tr>   </table>   </asp:Content> Примечание. Вставленные строки отображают исходное изображение в хранилище больших двоичных объектов и оценку времени жизни (TTL) закэшированного изображения в CDN. Необходимо включить Javascript в браузере для просмотра значения времени жизни. Внимание! Прежде чем запустить решение на выполнение, убедитесь, что выбран запускаемый проект, а начальная страница веб-проекта пуста. Чтобы выбрать запускаемый проект, в обозревателе решений щелкните правой кнопкой мыши проект CDNService и выберите Назначить запускаемым проектом. Чтобы задать начальную страницу, в обозревателе решений щелкните правой кнопкой мыши проект CDNSample и выберите пункт Свойства. В окне Свойства перейдите на вкладку Интернет и в разделе Действие при запуске выберите параметр Указанная страница. Оставьте значение этого поля пустым. Чтобы построить и запустить приложение в эмуляторе вычислений, нажмите клавишу F5. Обратите внимание, что на странице оба изображения отображаются рядом, а накладывающийся заголовок показывает текущее и исходное время, а также одинаковые отметки времени. Верхнее изображение возвращено сетью доставки содержимого, а нижнее соответствует исходному изображению в хранилище больших двоичных объектов. Таймер Предполагаемое время жизни (TTL) отображает приближенное значение времени жизни для изображения, закэшированного сетью доставки содержимого (CDN).   Рис. 36 Первоначальный запрос показывает, что содержимое, кэшируемое CDN, соответствует большим двоичным объектам источника Обновите страницу в браузере. Обратите внимание, что обновленная отметка времени отображается на изображении, полученном из службы больших двоичных объектов (нижнее), в то время как изображение, возвращаемое из CDN (верхнее), по-прежнему показывает исходную отметку времени. Кроме того, в таймере Предполагаемое время жизни (TTL) отображается снижение времени жизни большого двоичного объекта, кэшируемого сетью доставки содержимого.   Рис. 37 Запрос отображает, что CDN возвращает закэшированное содержимое Примечание. Поскольку заголовком Cache-Control большого двоичного объекта, содержащего изображение, определено время жизни в 30 секунд, CDN будет возвращать закэшированные изображения до тех пор, пока не истечет срок действия. Обновите страницу несколько раз, прежде чем таймер времени жизни (TTL) достигнет нуля, чтобы убедиться в том, что изображение из CDN находится в кэше. Примечание. Действие контроллера по отображению страницы вычисляет значение времени жизни (TTL), отображаемое на этой странице. Но обратите внимание, что это лишь приблизительная оценка, в конечном счете время жизни (TTL) закэшированного большого двоичного объекта определяется моментом, когда браузер выполняет свой первоначальный запрос к CDN для извлечения изображения. Значение выводится для удобства пользователя, но и другие факторы также могут способствовать повышению задержки между моментом времени, когда сервер осуществляет вычисление, и моментом, когда браузер отображает страницу, что может привести к несоответствиям. Это значение используется просто как приблизительный индикатор. В заключение дождитесь окончания времени жизни (TTL) и обновите страницу еще раз. Обратите внимание, что, как только время жизни (TTL) истекло, после обновления страницы оба изображения снова покажут одинаковую отметку времени, указывая на то, что сеть доставки содержимого (CDN) произвела выборку изображения из хранилища больших двоичных объектов и повторно поместила его в кэш. Рис. 38 Ожидание окончания времени жизни большого двоичного объекта в кэше CDN

Задача 2. Признание содержимого в кэше CDN недействительным с помощью управления версиями

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8