Azure 函数应用 blob 触发器无法上传文件

问题描述

我创建了一个 blob 触发器,它接受来自 blob 的文件,将其解压缩并使用流将其移动到另一个 blob。

我的代码是这样的

[FunctionName("Requests")]
[StorageAccount("samplecontainer")]
public static void Run([BlobTrigger("incoming/{name}")]Stream myBlob,[Blob("processing/{name}.xml",FileAccess.Write)] TextWriter output,string name,ILogger log)
{
    log.Log@R_630_4045@ion($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    string returnValue;

    using (Stream blob = myBlob)
    {
        using (GZipStream decompressionStream = new GZipStream(blob,CompressionMode.Decompress))
        {
            log.Log@R_630_4045@ion($"Unzipping file");
            name = name.Replace(".gz","");
            var content = String.Empty;
            using (StreamReader reader = new StreamReader(decompressionStream))
            {
                content = reader.ReadToEnd();
                reader.Close();

            }
            returnValue = content;
        }
    }
    log.Log@R_630_4045@ion($"C# Blob trigger function finished processing blob\n Name:{name} \n Now writing to xml");
    output.WriteLine(returnValue);
}

这实际上在我的 local.settings.json 文件中使用 "AzureWebJobsstorage": "UseDevelopmentStorage=true" 在本地运行时会起作用。

但是,一旦我部署了这个应用程序并使用 Azure 存储资源管理器将文件上传到真正的容器,就没有任何反应,活动日志显示 Write.Tiny.txt.gz 中的操作失败,找不到文件 'D :\home\site\wwwroot\Requests\tiny.txt.gz'。

我有可以工作的 http 触发器,并且我尝试关闭配置 WEBSITE_RUN_FROM_PACKAGE 没有效果。我可能缺少一些设置或配置吗? 当我在函数应用程序中控制台进入此路径并捕获 function.json 时,我得到了这个:

{
  "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.29","configurationSource": "attributes","bindings": [
    {
      "type": "blobTrigger","connection": "samplecontainer","path": "incoming/{name}","name": "myBlob"
    }
  ],"disabled": false,"scriptFile": "../bin/azure-functions.dll","entryPoint": "Requests.Run"
}

解决方法

好的,我可以重现您的问题。

既然你可以在本地工作,那么你的代码应该没有问题。

我可以解释为什么会发生这种情况。您在 azure 上的函数应用没有可以将数据写入 azure blob 存储的 RBAC。

以下步骤可以解决问题:

首先,创建函数应用的标识。

enter image description here

其次,将函数应用的 RBAC 角色添加到存储帐户。

enter image description here

对了,以上设置不会立即生效,需要等待几分钟才能生效。

,

我完全相信我还需要 Bowman Zhu 的回答才能使其工作,但在我的特定情况下,我忘记在我的 appSettings.json 中添加存储帐户作为连接字符串,因为我们最近更新到 Microsoft.Azure。 WebJobs.Extensions.Storage 版本 3,这是我们的第一个 blob 触发器。

在 appSettings.json 中:

{
  "ConnectionStrings": {
    "AzureWebJobsStorage": "{endpoint}"
  }
}