Dum*_*DED 7 .net c# azure-blob-storage azurite
我已经梳理了这个问题的至少十几个不同版本,但到目前为止,没有一个版本能给出我所遇到的问题的答案。我正在尝试开发一个概念验证,用于使用 Azurite 和具有相应存储帐户密钥的服务 SAS 从 Azure BLOB 存储检索图像。我正在使用众所周知的 Azurite 存储帐户凭据,如此处所示。在 C# 中似乎有无数种方法可以完成此类操作,但我选择宽松地遵循此示例,最终得到如下结果:
public Uri GetSharedKeySasUrl()
{
BlobServiceClient serviceClient = new BlobServiceClient(
new Uri("http://127.0.0.1:10000/devstoreaccount1/"),
new Azure.Storage.StorageSharedKeyCredential(
"devstoreaccount1",
"Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="
)
);
var blobContainer = serviceClient.GetBlobContainerClient("images");
var blobClient = blobContainer.GetBlobClient("00000-pano.jpg");
BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
BlobContainerName = "images",
BlobName = "00000-pano.jpg",
Resource = "b",
StartsOn = DateTimeOffset.UtcNow,
ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
};
sasBuilder.SetPermissions(BlobSasPermissions.Read);
Uri sasUri = blobClient.GenerateSasUri(sasBuilder);
Debug.WriteLine("SAS URI for blob is: {0}", sasUri);
return sasUri;
}
Run Code Online (Sandbox Code Playgroud)
这会生成一个看起来应该可以正常工作的URL ,但每当我将其粘贴到浏览器并尝试访问它时,我总是会得到以下信息:
<Error>
<Code>AuthorizationFailure</Code>
<Message>Server failed to authenticate the request. Make sure the value of the Authorization header is formed correctly including the signature. RequestId:551902dd-ecb8-4736-9cf1-32406d98c02f Time:2022-04-11T20:18:06.368Z</Message>
</Error>
Run Code Online (Sandbox Code Playgroud)
相反,如果我通过 Microsoft Azure 存储资源管理器生成 SAS 签名,则该 URL 可以正常工作。如果我将此 URL 与此方法生成的 URL 进行比较,两者的格式似乎都完美 - 我看不到任何表明我的 URL 格式错误的内容。
Generated by the method:
http://127.0.0.1:10000/devstoreaccount1/images/00000-pano.jpg?sv=2021-04-10&st=2022-04-11T20%3A17%3A59Z&se=2022-04-11T21%3A17%3A59Z&sr=b&sp=r&sig=bUHI2562NmvvtflOqT5kr0E%2BnZv7Q12PlR%2FGNPmEhL8%3D
Generated in Storage Explorer:
http://127.0.0.1:10000/devstoreaccount1/images/00000-pano.jpg?sv=2018-03-28&st=2022-04-11T20%3A06%3A47Z&se=2022-04-12T20%3A06%3A47Z&sr=b&sp=r&sig=V6N7uWDGgoVx8wirM%2FP1ou2kbg05PB4D%2BG8YQdvS5RU%3D
Run Code Online (Sandbox Code Playgroud)
唯一显着的区别似乎是每个人使用的服务版本 - 资源管理器使用2018-03-28而方法使用2021-04-10。我尝试在 BlobSasBuilder 中分配版本,但它只是被忽略,这与 Microsoft 自己关于已弃用的属性的评论一致,并且无论您在此处指定什么,该类始终使用最新支持的服务版本。但我仍然认为这不能解释问题。
有任何想法吗?先谢谢您的帮助。
编辑
我仍然绝望地坚持这一点。我已经多次尝试重新编写用于构建 SAS URI 的代码,希望能有所作为。到目前为止,没有一个有效。我尝试过的方法:
BlobUriBuilder,SasBuilder和StorageSharedKeyCredential生成 URIBlobServiceClientaStorageSharedKeyCredential来导出BlobContainerClient,BlobClient然后使用 和SasBuilder来生成 URIBlobServiceClientaStorageSharedKeyCredential"UseDevelopmentStorage=true"连接字符串BlobServiceClientHMACSHA256使用和 a手动签署字符串NameValueCollection以构造查询参数我还尝试使用不同的启动选项运行 Azurite,包括azurite --loose和azurite --skipApiVersionCheck。两者都没有任何区别。
我尝试过的其他事情:
我简直不明白为什么这是一个如此难以克服的问题。请帮忙。
更新的解决方案:
我已经测试了 Azure.Storage.Blobs 包版本 12.11.0,并给出了问题中描述的确切问题 OP。
将其更改为版本 12.10.0 解决了该问题。
由此得出的结论是,版本 12.11.0 必定是重大更改的副作用或错误。
所以在微软拿出解决方案或者答案之前,解决方案就是使用12.10.0版本。
原答案:
我已经测试了您的代码并且它有效,我没有收到您的错误。我想您要么需要重新安装最新版本的 Azurite,要么按照我的方式进行操作,它对我有用。
为了保证工作的一致性,我使用docker来安装azurite。
我使用 Windows 11 和 Docker Desktop,更多有关安装的信息请查看 Microsoft文档。
docker pull mcr.microsoft.com/azure-storage/azurite
Run Code Online (Sandbox Code Playgroud)
然后
docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 -v c:/azurite:/data mcr.microsoft.com/azure-storage/azurite
Run Code Online (Sandbox Code Playgroud)
现在我们已经启动并运行了 docker,我使用 Microsoft Azure Storage Explorer 创建一个 blob 容器并上传图像 00000-pano.jpg(这是一个花图像)。
现在,我获取您的代码而不更改其中的任何内容,并在我的控制台应用程序中使用包引用运行它
<PackageReference Include="Azure.Storage.Blobs" Version="12.10.0" />
Run Code Online (Sandbox Code Playgroud)
运行代码,我得到以下 URL:
http://127.0.0.1:10000/devstoreaccount1/images/00000-pano.jpg?sv=2020-08-04&st=2022-04-20T10%3A47%3A00Z&se=2022-04-20T11%3A47%3A00Z&sr=b&sp=r&sig=RHHe5NJRjhbOjoTeCONqhrRHjjJCygOa8urcwzOWpeE%3D
Run Code Online (Sandbox Code Playgroud)
我将 URL 复制并粘贴到浏览器中,然后我就得到了花,没有出现身份验证问题:
以下是我的 docker 控制台以及我对图像所做操作的日志:
免责声明:我有一些关于 Azurite 和 docker、使用 Azurite 测试 Azure 代码以及模拟 Azure 存储的文章,这可能会为您的进一步工作增加价值。(https://itbackyard.com/tag/azurite/)
更新
在向 Azure SDK 团队提交错误后,我发现根据之前 发现的这些问题,该问题的修复实际上正在 Azurite 端进行处理。目前,Azurite 似乎根本不支持 SAS 版本 2020-10-02 及更高版本。对于那些希望使用最新 SAS 版本进行本地开发的人来说,值得关注这一点。
原答案
这是一个版本控制问题。无论出于何种原因,最新版本的 Azure.Storage.Blobs(12.11.0,在撰写本文时)绝对拒绝与 Azurite 一起使用,但版本 12.10.0 工作得很好。
新版本似乎发生了某种重大变化。我已向 SDK 团队提交了一个错误,只是为了增加一些可见性。与此同时,我想我会坚持使用 12.10.0 版本。
| 归档时间: |
|
| 查看次数: |
2736 次 |
| 最近记录: |