当前位置: 首页 > 知识库问答 >
问题:

事件网格触发器Azure功能:如何访问已删除blob的元数据(用户定义的键、值对)?

曹育
2023-03-14

如何在事件网格触发器Azure函数中获取已删除blob的元数据?下面是一个C#代码示例-

[FunctionName("EventGridTriggerFunction")] 
public static void Run([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log) 
{ log.LogInformation(eventGridEvent.Data.ToString());
}

我可以从EventGridEvent获取吗--

引用链接-https://docs . Microsoft . com/en-us/azure/event-grid/event-schema-blob-storage

[{
  "topic": "/subscriptions/{subscription-id}/resourceGroups/Storage/providers/Microsoft.Storage/storageAccounts/my-storage-account",
  "subject": "/blobServices/default/containers/test-container/blobs/new-file.txt",
  "eventType": "Microsoft.Storage.BlobCreated",
  "eventTime": "2017-06-26T18:41:00.9584103Z",
  "id": "831e1650-001e-001b-66ab-eeb76e069631",
  "***data***": {
    "api": "PutBlockList",
    "clientRequestId": "6d79dbfb-0e37-4fc4-981f-442c9ca65760",
    "requestId": "831e1650-001e-001b-66ab-eeb76e000000",
    "eTag": "\"0x8D4BCC2E4835CD0\"",
    "contentType": "text/plain",
    "contentLength": 524288,
    "blobType": "BlockBlob",
    "url": "https://my-storage-account.blob.core.windows.net/testcontainer/new-file.txt",
    "sequencer": "00000000000004420000000000028963",
    "storageDiagnostics": {
      "batchId": "b68529f3-68cd-4744-baa4-3c0498ec19f0"
    }
  },
  "dataVersion": "",
  "metadataVersion": "1"
}]

共有1个答案

祁杰
2023-03-14

您的解决方案没有优雅的解决方法。但是,在调用取消删除blob请求后,在存储帐户中打开blob的软删除选项将启用在EventGridTrigger订阅者中获取blob元数据。

以下代码片段显示了此实现示例:

run.csx:

#r "Newtonsoft.Json"
#r "Microsoft.WindowsAzure.Storage"

using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Microsoft.WindowsAzure.Storage.Blob;
using System.Linq;


public static async Task Run(JObject eventGridEvent, CloudBlockBlob blob, ILogger log)
{
    log.LogInformation($"{eventGridEvent}");

    if (eventGridEvent["data"]["contentType"].Value<string>() != "abcd" && eventGridEvent["data"]["api"].Value<string>() == "DeleteBlob")
    {
        await blob.UndeleteAsync();
        await blob.FetchAttributesAsync();           
    
        log.LogInformation($"\nMetadata: {string.Join(" | ", blob.Metadata.Select(i => $"{i.Key}={i.Value}"))}");
    
        // ...
    
        blob.Properties.ContentType = "abcd";
        await blob.SetPropertiesAsync();
        await blob.DeleteAsync();
    }
    else if (eventGridEvent["data"]["contentType"].Value<string>() != "abcd")
    {
        await blob.FetchAttributesAsync();           
    
        log.LogInformation($"\nMetadata: {string.Join(" | ", blob.Metadata.Select(i => $"{i.Key}={i.Value}"))}");

    }

    await Task.CompletedTask;
}

function.json

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "eventGridEvent",
      "direction": "in"
    },
    {
      "type": "blob",
      "name": "blob",
      "path": "{data.url}",
      "connection": "rk2018ebstg_STORAGE",
      "direction": "in"
    }
  ],
  "disabled": false
}

请注意,存储帐户发出的事件消息中的数据对象只包括blob文件的两个属性,如contentType和contentLength。

上述实现用于避免订阅者对具有意外值(例如abcd)的Blob属性contentType的DeleteBlob的循环。

如果软删除的blob允许检索其属性和/或元数据,这将很好。我在这里写了这个选项的反馈。

 类似资料:
  • 我正在尝试设置一个 Powershell Azure 函数,该函数在 Blob 存储容器中创建文件时触发。该函数需要处理 Blob 文件并将其保存到其他 Blob 存储容器。 目前这个函数什么都不做,因为我正在尝试处理下面的问题。 我无法从 powershell 函数内部访问 blob。我能够使用属性在c#中实现这一点,但似乎Powershell不支持属性。 我尝试在函数的集成选项卡下添加Azur

  • 我正在调查可用于 Azure 存储的 Webhook/事件触发器。不幸的是,文档似乎专注于演示如何让 Azure 门户为我构建函数,这不允许进行本地测试。 特别是,我正在研究捕获已删除 Blob 的时间。 我的使用示例(Azure函数): 当我从存储容器中删除一个blob时,问题出现了:函数没有被触发。 然而,我发现,如果我在控制台中点击<code>CTRL C</code>则该函数被触发。 有人

  • 我已经实现了一个EventGrid触发器来响应Blob存储事件,其逻辑简化如下: 外部API的响应时间不长(1秒或更短),我对主机的配置设置为默认(因此允许无限数量的并发调用)。 当同时添加多个blob(从只有2个blob开始)时,我在日志中得到了很多重复的事件(脚本正在快速地一个接一个地上传blob,中间没有等待时间)。 我觉得这可能是由于我从不承认收到事件,我不知道我是否应该在我的代码中执行此

  • 我们有一个 Azure 设置,其中包含一个 Azure 事件网格主题,并且我们有一个 Azure 函数服务,其中包含大约 15 个函数,这些函数通过不同的前缀筛选器订阅该主题。Azure 函数服务设置为基于消耗的资源,应该能够根据需要进行缩放。 每个订阅都设置为在最多4小时内尝试交付10次,然后放弃活动。到目前为止一切顺利,设置大部分时间都按预期工作。 在某些情况下,对于我们未知的情况,事件网格主

  • 我在 Azure 数据工厂中具有事件触发器,它在 Azure Blob 存储中创建新 Blob 时触发。但我的触发器在创建 Blob 时没有触发。 已按照以下链接进行操作,但卡在下面提到的点:Azure 数据工厂:事件未启动管道。 环境详情: 事件网格已注册,ADF为v2并将参数传递给管道。我的问题是我是否需要激活Azure存储事件订阅?如果是这样,我的事件处理程序应该是什么(在我的情况下是ADF

  • 我的Azure Functions事件网格触发器没有触发。我是这么做的。 Key Vault设置为将事件报告给EventGrid系统主题 此主题由将事件传递到Azure Function的订阅订阅 函数有一个事件网格触发器(见下文,默认由门户创建): 我用谷歌搜索了一下,对于这样的入门级方案,没有更多的指导。我想的也许是授权...订阅如何触发该函数?在此过程中(通过GUI /门户配置),没有任何关