C# azure函数绑定导致触发多个事件

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会出现重复事件?

我正在我的函数应用程序中使用以下绑定:

        [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触发的,因为事件的
主题
标识它是哪个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输出。