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

Posted

技术标签:

【中文标题】Azure 函数在 blob 触发期间找不到 blob【英文标题】:Azure function cannot find blob during blob trigger 【发布时间】:2020-06-09 15:09:58 【问题描述】:

html 文件放入 Azure blob 存储时,会触发一个 Azure 函数。该函数会打开 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();

【问题讨论】:

为什么它们必须是独立的函数? 错误来自 Etag 更改。加载到 blob 时,function1 认为它是陈旧的。 【参考方案1】:

我觉得你的错误应该是这样的:Funtion1检索blob,然后function2对blob的操作导致了Etag的变化。然后function1尝试加载取回的blob,但是发现Etag发生了变化,所以异常返回给你。

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

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

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

【讨论】:

以上是关于Azure 函数在 blob 触发期间找不到 blob的主要内容,如果未能解决你的问题,请参考以下文章

Azure Blob存储DownloadToStreamAsync在网络更改期间挂起

azure blob 存储“找不到有效的帐户信息组合”

Azure 函数 Blob 触发器将文件复制到文件共享

Azure 函数从门户或 Visual Studio-Blob 触发器执行

使用 epplus 从 blob 触发 azure 函数访问 excel 文件

如何从 HTTP 触发的 Azure 函数返回 blob?