Существует функция Azure, которая срабатывает, когда файлы HTML помещаются в Azure хранилище BLOB-объектов. Функция открывает файл HTML и преобразует его в JSON. Существует небольшой процент запущенных файлов (менее 1%), в результате которого возникает следующее исключение:
Microsoft. WindowsAzure .Storage.StorageException
Случается, что есть вторая функция, вызванная размещением большого двоичного объекта, который изменяет тип содержимого файлов, но я не уверен, влияет ли это на способность первой функции также открывать файл.
Что можно сделать так, чтобы функции Azure могли правильно обрабатывать файлы HTML, не создавая исключения этого типа?
Свойства исключений :
Сообщение: исключение во время выполняющая функция: [Имя функции здесь] Условие, указанное с помощью условных заголовков HTTP, не выполнено.
Тип исключения: Microsoft. WindowsAzure .Storage.StorageException
Сбой метода: HtmlAgilityPack.HtmlDocument.Load
Тип исключения: Microsoft. WindowsAzure .Storage.StorageException
Функция 1 (вспомогательные методы, класс и пространство имен для краткости опущены):
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using HtmlAgilityPack;
using System.Threading.Tasks;
[FunctionName("Function name")]
public static async Task Run([BlobTrigger("container-name/html/{name}", Connection = "ConnectionString")]Stream myBlob, ILogger log, Binder binder)
{
var doc = new HtmlDocument();
doc.Load(myBlob);
var form = doc.DocumentNode.SelectSingleNode("//form");
var elements = form.SelectNodes("//input");
CustomType MyObject = BuildObject(elements);
var attributes = new Attribute[]
{
new BlobAttribute("container-name/json/" + MyObject.ID + ".json"),
new StorageAccountAttribute("ConnectionString")
};
using (var writer = await binder.BindAsync<TextWriter>(attributes))
{
writer.Write(BuildJSON(MyObject));
}
}
Функция 2 тот же триггер, но в другой функции и его собственный файл .cs. Класс и пространство имен для краткости опущены:
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Blob;
[FunctionName("Function name")]
public static async Task Run([BlobTrigger("container-name/html/{name}", Connection = "ConnectionString")]ICloudBlob myBlob)
{
if (myBlob.Properties.ContentType == "text/html; charset=utf-8")
return;
myBlob.Properties.ContentType = "text/html; charset=utf-8";
await myBlob.SetPropertiesAsync();
}