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 函数从门户或 Visual Studio-Blob 触发器执行