c# - Azure Blob 存储将元数据从上传传递到 Blob 触发器

标签 c# azure azure-blob-storage

我正在开发一组 Azure Functions 来执行此高级流程

  • 通过Http Trigger接收HTTP请求
  • 将这些请求的元数据保存到表存储
  • 生成上传到 Blob 存储的 PDF
  • 更新表存储中的记录以包含对文档的引用

除了最后一部分之外,一切正常。

当 PDF 上传到 Blob 存储时,我们可以访问请求元数据,但 Blob 触发器只能访问已上传的 PDF 流。

我尝试过以下方法:

文件上传

 var context = new OperationContext();
 context.UserHeaders = new Dictionary<string, string>();
 context.UserHeaders.Add("RowKey", entity.RowKey);
 context.UserHeaders.Add("PartitionKey", entity.PartitionKey);
 cloudBlockBlob.UploadFromStream(downloadedStream, operationContext: context);

Blob 触发器私有(private)方法

public static void Run(
        [BlobTrigger(FunctionConstants.PrintSetToBlobName, Connection = ConnectionStringName)]Stream myBlob, 
        string name, 
        TraceWriter log)
{
     // code truncated for clarity
     string documentUrl = GetDocumentUrl();
     UpdateEntity(documentUrl);
}

private static void UpdateEntity(string documentUrl)
{
        // This doesn't seem like it will work
        OperationContext context = new OperationContext();
        EntityService entityService = new EntityService();

        context.UserHeaders.TryGetValue("RowKey", out string rowKey);
        context.UserHeaders.TryGetValue("PartitionKey", out string partitionKey);

        var entity = entityService.Get(rowKey, partitionKey);

        entity.DocumentUrl = documentUrl;
        entityService.Update(entity);
}

我尝试直接将 OperationContext 作为参数传递到 BlobTrigger.Run 函数中,但出现运行时错误,因为它不是有效的输入。

最终,我的问题是如何从 CloudBlockBlob.UploadFromStream 方法传递元数据并在 Blob 触发器中读取它?

最佳答案

UserHeaders 设置将 blob 上传到 Azure 存储的请求的 HTTP header 。这些 header 在 BlobTrigger 中不可用,因此您无法使用它们来传递其他参数。

您可以将 PartitionKeyRowKey 保存到 blob 元数据:

cloudBlockBlob.Metadata["PartitionKey"] = entity.PartitionKey;
cloudBlockBlob.Metadata["RowKey"] = entity.RowKey;
cloudBlockBlob.SetMetadata();

并在您的其他函数中将 BlobTrigger 绑定(bind)到 CloudBlockBlob

public static void Run(
    [BlobTrigger(FunctionConstants.PrintSetToBlobName, Connection = ConnectionStringName)]CloudBlockBlob cloudBlockBlob, 
    string name, 
    TraceWriter log)
{
    ...
} 

并读取元数据

cloudBlockBlob.FetchAttributes();
var partitionKey = cloudBlockBlob.Metadata["PartitionKey"];
var rowKey = cloudBlockBlob.Metadata["RowKey"];

关于c# - Azure Blob 存储将元数据从上传传递到 Blob 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53541192/

相关文章:

javascript - Azure 服务器无法对请求进行身份验证。确保授权 header 的值格式正确,包括签名

c# - 向网页添加工具栏

C# 检查数据库项目的年龄

css - 自定义 Azure API 管理开发人员门户

memory - 如何查看/报告 Windows Azure CPU 和内存使用情况?

azure - 有没有 azure 的替代方案来移植 .net 应用程序

Azure CLI 下载错误

c# - + 运算符如何用于组合委托(delegate)?

C#:如何从 WebBrowser 元素获取文档标题?

c# - Azure Blob 存储 Blob 是否支持随机访问流?