问题描述
我创建了一个 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。
以下步骤可以解决问题:
首先,创建函数应用的标识。
其次,将函数应用的 RBAC 角色添加到存储帐户。
对了,以上设置不会立即生效,需要等待几分钟才能生效。
,我完全相信我还需要 Bowman Zhu 的回答才能使其工作,但在我的特定情况下,我忘记在我的 appSettings.json 中添加存储帐户作为连接字符串,因为我们最近更新到 Microsoft.Azure。 WebJobs.Extensions.Storage 版本 3,这是我们的第一个 blob 触发器。
在 appSettings.json 中:
{
"ConnectionStrings": {
"AzureWebJobsStorage": "{endpoint}"
}
}