有一个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();
}
答案 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