Azure функция не может найти блоб во время запуска блоба - PullRequest
0 голосов
/ 25 февраля 2020

Существует функция 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();
}

1 Ответ

0 голосов
/ 26 февраля 2020

Я думаю, что ваша ошибка должна выглядеть следующим образом: Funtion1 извлекает BLOB-объект, а затем операция function2 над BLOB-объектом вызывает изменение Etag. Затем function1 пытается загрузить полученный BLOB-объект, но обнаруживает, что Etag изменился, поэтому он возвращается к вам ненормальным.

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

Azure Для большого двоичного объекта хранилища используется «сильная проверка Etag». содержимое двух представлений ресурсов должно быть побайтовым, и все остальные поля сущностей (такие как Content-Language) также не изменяются.

Пожалуйста, обратитесь к этому: https://www.microsoftpressstore.com/articles/article.aspx?p=2224058&seqNum=12

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...