C# azure函数绑定导致触发多个事件
为什么创建的同一Blob会出现重复事件? 我正在我的函数应用程序中使用以下绑定:C# azure函数绑定导致触发多个事件,c#,azure-functions,azure-storage-blobs,azure-blob-storage,azure-eventgrid,C#,Azure Functions,Azure Storage Blobs,Azure Blob Storage,Azure Eventgrid,为什么创建的同一Blob会出现重复事件? 我正在我的函数应用程序中使用以下绑定: [Blob("%Detach:Output%/{file}", Write)] CloudBlockBlob @out, 我写入此输出绑定的唯一时间是: await @out.UploadTextAsync(xml); 我有一个事件定义如下: 其中Detach:Outputenv变量是xml输出和链接容器 我每次执行此函数都会得到2个事件: { [Fu
[Blob("%Detach:Output%/{file}", Write)] CloudBlockBlob @out,
我写入此输出绑定的唯一时间是:
await @out.UploadTextAsync(xml);
我有一个事件定义如下:
其中Detach:Output
env变量是xml输出和链接容器
我每次执行此函数都会得到2个事件:
{
[FunctionName("Detach")]
[StorageAccount("Global:Connection")]
public static async Task Run(
[QueueTrigger("%Detach:Trigger%")] DetachJob detach,
[Blob("%Detach:Input%/{file}", Read)] CloudBlockBlob @in,
[Blob("%Detach:Output%/{file}", Write)] CloudBlockBlob @out,
[Blob("%Detach:Error%/{file}", Write)] CloudBlockBlob fail,
[Blob("%Detach:Error%/{file}_error", Write)] CloudBlockBlob error,
[Blob("%Detach:Attachments%", Write)] CloudBlobContainer attachments)
{
try
{
var xml = await @in.DownloadTextAsync();
var size = ToInt32(GetEnvironmentVariable("Detach:BytesThreshold"));
var bigNodes = GetNodesGreaterThan(size, xml);
foreach (var node in bigNodes)
{
var ext = GetExtension(node.Value);
var path = $"{detach.file}/{node.Key}{ext}.base64";
var attachment = attachments.GetBlockBlobReference(path);
await attachment.UploadTextAsync(node.Value);
xml = xml.Replace(node.Value, path);
}
await @out.UploadTextAsync(xml);
}
catch (Exception e)
{
await error.UploadTextAsync(e.ToString());
await fail.StartCopyAsync(@in);
}
}
}
两个事件之间的eventTime
略有不同:
- 2019-08-05T22:27:06.5279893Z
- 2019-08-05T22:27:06.5019647Z
主题
标识它是哪个blob:
"subject": "/blobServices/default/containers/xml-output-with-links-container/blobs/tobossthe_awesome_blob.xml",
我已经通过使用links容器将有效负载上传到xml输出来手动测试了这一点,并且只触发了一个事件。但是,当函数执行时,会创建两个事件
为什么我们会收到重复的事件?
以下是整个功能:
{
[FunctionName("Detach")]
[StorageAccount("Global:Connection")]
public static async Task Run(
[QueueTrigger("%Detach:Trigger%")] DetachJob detach,
[Blob("%Detach:Input%/{file}", Read)] CloudBlockBlob @in,
[Blob("%Detach:Output%/{file}", Write)] CloudBlockBlob @out,
[Blob("%Detach:Error%/{file}", Write)] CloudBlockBlob fail,
[Blob("%Detach:Error%/{file}_error", Write)] CloudBlockBlob error,
[Blob("%Detach:Attachments%", Write)] CloudBlobContainer attachments)
{
try
{
var xml = await @in.DownloadTextAsync();
var size = ToInt32(GetEnvironmentVariable("Detach:BytesThreshold"));
var bigNodes = GetNodesGreaterThan(size, xml);
foreach (var node in bigNodes)
{
var ext = GetExtension(node.Value);
var path = $"{detach.file}/{node.Key}{ext}.base64";
var attachment = attachments.GetBlockBlobReference(path);
await attachment.UploadTextAsync(node.Value);
xml = xml.Replace(node.Value, path);
}
await @out.UploadTextAsync(xml);
}
catch (Exception e)
{
await error.UploadTextAsync(e.ToString());
await fail.StartCopyAsync(@in);
}
}
}
我在想,可能是CloudBlockBlob
触发了两次。因此,我将绑定更改为CloudBlobContainer
:
[Blob("%Detach:Output%", Write)] CloudBlobContainer @out,
并更新了相应的代码:
var shrink = @out.GetBlockBlobReference(file);
await shrink.UploadTextAsync(xml);
但结果还是一样:我仍然有两个项目 通过使用逻辑应用程序将有效负载放入blob存储器,我触发了分离
功能,步骤如下:
此步骤正在生成2个BlobCreated事件强>
关闭thunking
后,问题已得到解决,现在只有1个BlobCreated
事件正在生成:
我无法使用wait@out.UploadTextAsync(“{}”);的单个blob输出绑定重现您的问题;,一切都很顺利。尝试执行相同的操作,例如仅绑定一个blob输出。