0

我创建了一个 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.LogInformation($"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.LogInformation($"Unzipping file");
            name = name.Replace(".gz", "");
            var content = String.Empty;
            using (StreamReader reader = new StreamReader(decompressionStream))
            {
                content = reader.ReadToEnd();
                reader.Close();

            }
            returnValue = content;
        }
    }
    log.LogInformation($"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 无效。我可能缺少一些设置或配置吗?当我在函数应用程序中控制台进入此路径并 cat 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"
}
4

2 回答 2

2

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

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

我可以解释为什么会这样。azure 上的函数应用没有可将数据写入 azure blob 存储的 RBAC。

以下步骤可以解决问题:

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

在此处输入图像描述

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

在此处输入图像描述

顺便说一句,以上设置不会立即生效,需要等待几分钟才能生效。

于 2021-03-09T02:06:26.653 回答
1

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

在 appSettings.json 中:

{
  "ConnectionStrings": {
    "AzureWebJobsStorage": "{endpoint}"
  }
}
于 2021-03-09T13:11:51.600 回答