Доктор Эндрю Ле Гир

У нас в Horizon развернуто несколько сложных и надежных веб-решений. Мы используем Azure App Services и считаем, что это очень профессиональное и действительно прекрасное решение для производственных продуктов, но это недешево. План обслуживания, который может включать службу приложений, стоит около 700 фунтов стерлингов в год.

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

Тем не менее, иногда вам просто нужен быстрый, грязный внутренний инструмент, который либо отображает некоторый контент, либо выполняет некоторые функции администратора dev ops. Вас может мало волновать набор профессиональных услуг, сопровождающих веб-приложение, и гораздо больше заботит минимизация стоимости запуска инструмента — желательно бесплатно!

Введите — Azure работает! Функции Azure теперь продвигаются как часть философии разработки Microsoft Serverless Computing и Micro-services. Я не буду увязнуть в объяснениях этих концепций здесь, но Microsoft гораздо лучше объясняет их:

  1. https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-overview-microservices
  2. https://azure.microsoft.com/en-us/services/functions/

Важно то, что они в основном продвигаются как средство предоставления API на основе http как часть решений SaaS на серверной части инфраструктуры или решения. Стандартные руководства в основном выглядят так: https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-azure-function

Но было бы неплохо взломать функцию Azure, чтобы вместо этого возвращать содержимое в ваш браузер?

Сначала аннотируйте свою функцию Azure, чтобы она отвечала на запросы «GET» без проверки подлинности:

public static async Task<object> Run([HttpTrigger(AuthorizationLevel.Anonymous, "GET")]HttpRequestMessage req, TraceWriter log)

В «req», если вы хотите получить доступ к параметрам запроса, которые вы передаете в запросе GET, просто извлеките их следующим образом:

var queryParams = req.GetQueryNameValuePairs();

Затем вы хотите вернуть html-контент запрашивающей стороне. Это должен быть полноценный html-документ. Медиатип ответа должен быть «text/html». Здесь я помещаю содержимое в переменную с именем «html»:

var response = new HttpResponseMessage();
                response.Content = new StringContent(html);
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
                return response;

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

Например:

<img src="data:image/png;base64,iVBORw0KGgoA...SuQmCC">

Вы можете использовать такой сайт, как https://www.base64-image.de/, чтобы преобразовать ваш образ в базу 64. Недостаток здесь, конечно, в том, что мы потеряли всю замечательную мощь ASP.NET Core. . Нет бритвенных страниц, нет встроенного jQuery, нет разрешения модели и т. д., но если это быстрый инструмент или услуга, которую вы хотите разместить, то это здорово!

Так почему же это дешево? Ну, ответ не так однозначен.

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

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

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

Вот пример одной из наших функций Azure, отображающих HTML. Мы используем его как простой обозреватель блоков для Kovan Ethereum:

https://blockchainexplorer-kovan.azurewebsites.net/api/BlockchainExplorer?block=0x816420&hash=0x51edb532249fe195f69e8de16004b455e0ac6d7f7ad6747844da05f0d597548a