我很确定这是Windows Azure SDK(使用最新的1.4)的限制,但是必须有一种方法来解决这个问题,而不使用手动REST…
代码:
CloudBlob blob = container.GetBlobReference(url); // works
blob.UploadByteArray(bytes); // works
blob.Metadata["test"] = "public, max-age=259200"; // works
// FAILS with "The metadata specified is invalid. It has characters that are not permitted."
blob.Metadata["x-ms-blob-cache-control"] = "public, max-age=259200";
blob.SetMetadata(); // FAILS due to the 2nd meta data
从我的测试中可以很清楚地看出,由于这些破折号'-',客户端正在爆炸,但我想不出任何方法来解决这个问题。设置缓存控制是非常重要的,也是常见的操作,这让我很困惑,为什么我找不到其他人报告这个问题。
我还尝试过对数据进行编码,这在技术上应该是不必要的,但出于绝望,我还是这样做了。想法吗?
这最终成为一个愚蠢的SDK限制,毕竟有一个特定的属性,反过来为您设置特定的元数据…我不介意有这个属性作为一个助手,但我认为没有理由为什么直接设置元不应该工作。
blob.Properties.CacheControl = "public, max-age=259200";
blob.UploadByteArray(bytes);
您今天仍然得到此消息,但在nuget包Azure.Storage中替换了'BlobContainerClient'。Blobs,版本12.14.1。下面是使用Azure和部署在Azure的版本:
var blobClient = blobContainerClient.GetBlobClient(blobName);
if (await blobClient.ExistsAsync())
{
// Azurite doesn't support tags and Azure doesn't support use of metadata so make it work case by case.
var isLocalEnvironment = string.IsNullOrEmpty(Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID"));
if (!isLocalEnvironment)
{
// This solution works only in Azure.
var tags = new Dictionary<string, string>
{
{ "TagKey1", "value1" },
{ "TagKey2", "value2" },
};
await blobClient.SetTagsAsync(tags);
}
else
{
// This solution works in Azurite (it does work in Azure also - but only without special characters).
BlobProperties properties = blobClient.GetProperties();
properties.Metadata["TagKey1"] = "value1";
properties.Metadata["TagKey2"] = "value2";
await blobClient.SetMetadataAsync(properties.Metadata);
}
}
允许的特殊字符:
https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags?source=recommendations&标签= azure-ad