Azure函数在Blob触发期间找不到Blob

时间:2020-02-25 19:51:00

标签: c# azure azure-functions azure-blob-storage

有一个Azure函数,当将HTML文件放入Azure blob存储时会触发该函数,该函数将打开HTML文件并将其转换为JSON。触发文件的比例很小(少于1%),导致以下异常:

Microsoft.WindowsAzure.Storage.StorageException

碰巧有一个第二个函数是由blob的放置触发的,它会更改文件的内容类型,但是我不确定这是否会影响第一个函数同时打开文件的能力。

怎样做才能使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 :(得分:0)

我认为您的错误应如下所示:Funtion1检索blob,然后function2在blob上的操作导致Etag更改。然后function1尝试加载检索到的Blob,但发现Etag已更改,因此它会返回给您异常。

如果资源被多个应用程序访问或更改,请尝试确保未更改原始文件。否则,blob的Etag将自动更改。

Azure Storage Blob使用“强大的Etag验证”。两个资源表示形式的内容必须逐字节相同,并且所有其他实体字段(例如Content-Language)也必须保持不变。

请参考:https://www.microsoftpressstore.com/articles/article.aspx?p=2224058&seqNum=12