无法删除触发Azure函数Blob输入绑定的Blob

时间:2018-10-19 03:15:31

标签: c# azure azure-storage azure-functions azure-storage-blobs

这是该问题的后续问题:

How to delete a blob using Azure Functions?

当Blob触发我的Azure函数时,一旦完成处理,我需要将其删除。否则,我最终将在容器中出现许多斑点。

当我运行以下代码时:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connection);
var blobClient = storageAccount.CreateCloudBlobClient();
var container = blobClient.GetContainerReference("process");
var blockBlob = container.GetBlockBlobReference($"process/in/{name}"); // ==> This was the problem. See the answer for more info. 
bool deleted = blockBlob.DeleteIfExists();

方法blockBlob.DeleteIfExists()始终返回false,并且永远不会删除该blob。

我的猜测是,由于blob刚刚触发了它,因此它以某种方式被函数执行锁定。

[更新1]

...

[更新2]

非常感谢@Jerry Liu,该问题与Azure Fundctions无关。

诀窍在于,blockBlob.DeleteIfExists()在呼叫者错误地发送错误路径时返回false。

更好的方法可能是使用“ blockBlob.Delete”并找出实际的问题是什么。

有关更多信息,请参见DeleteIfExists源代码。

https://github.com/Azure/azure-storage-net/blob/master/Lib/ClassLibraryCommon/Blob/CloudBlob.cs#L1993

另一个相关问题: Azure CloudBlockBlob.DeleteIfExists() - Does false always mean the blob doesn't exist?

1 个答案:

答案 0 :(得分:1)

问题位于此行

var blockBlob = container.GetBlockBlobReference($"process/in/{name}");

blob名称应为$"in/{name}",因为我们根据GetBlockBlobReference中已有的特定容器调用GetContainerReference

重复导致Storage无法找到Blob。我们可能对没有相关的提示/异常感到困惑,因为DeleteIfExists在blob不存在时也会返回false。