Azure blob 授权 header
Azure blob authorization header
我正在尝试使用 refit 从 Xamarin iOS 应用程序上传到 Azure blob 存储。这是我用于 Refit 的界面配置:
[Headers("x-ms-blob-type: BlockBlob")]
[Put("/{fileName}")]
Task<bool> UploadAsync([Body]byte[] content, string sasTokenKey,
[Header("Content-Type")] string contentType);
sasTokenKey 参数如下所示:
"/content-default/1635839001660743375-66f93195-e923-4c8b-a3f1-5f3f9ba9dd32.jpeg?sv=2015-04-05&sr=b&sig=Up26vDxQikFqo%2FDQjRB08YtmK418rZfKx1IHbYKAjIE%3D&se=2015-11-23T18:59:26Z&sp=w"
这就是我使用 Refit 调用 azure blob 服务器的方式:
var myRefitApi = RestService.For<IMyRefitAPI>("https://myaccount.blob.core.windows.net");
myRefitApi.UploadAsync(photoBytes, sasTokenKey, "image/jpeg"
但是我收到以下错误:
Response status code does not indicate success: 403 (Server failed to
authenticate the request. Make sure the value of Authorization header is
formed correctly including the signature.)
如果我像这样直接调用 SAS url 就可以正常工作
var content = new StreamContent(stream);
content.Headers.Add("Content-Type", "jpeg");
content.Headers.Add("x-ms-blob-type", "BlockBlob");
var task = HttpClient.PutAsync(new Uri(sasTokenUrl), content);
task.Wait();
所以基本上我只是想用 Refit 做同样的事情。
知道如何让 Refit 使用 Azure Blob 存储吗?
谢谢!
[更新] 我现在可以将字节上传到 azure blob 服务器,但字节数据似乎有问题,因为我无法查看图像。这是我用来转换为字节数组的代码。
byte[] bytes;
using (var ms = new MemoryStream())
{
stream.Position = 0;
stream.CopyTo(ms);
ms.Position = 0;
bytes = ms.ToArray();
}
[更新] 通过使用流而不是字节数组修复了它!
这是 Authorization
header 的不正确用法。当您想使用帐户密钥授权请求时,您可以使用 Authorization
header。如果你有 Shared Access Signature
那么你真的不需要这个 header 因为授权信息包含在 SAS 本身中。您可以简单地使用 SAS URL 上传文件。
我看到 %2F 和 %3D,我很好奇改装是否第二次对它们进行编码。尝试在不编码的情况下发送令牌。
我正在尝试使用 refit 从 Xamarin iOS 应用程序上传到 Azure blob 存储。这是我用于 Refit 的界面配置:
[Headers("x-ms-blob-type: BlockBlob")]
[Put("/{fileName}")]
Task<bool> UploadAsync([Body]byte[] content, string sasTokenKey,
[Header("Content-Type")] string contentType);
sasTokenKey 参数如下所示:
"/content-default/1635839001660743375-66f93195-e923-4c8b-a3f1-5f3f9ba9dd32.jpeg?sv=2015-04-05&sr=b&sig=Up26vDxQikFqo%2FDQjRB08YtmK418rZfKx1IHbYKAjIE%3D&se=2015-11-23T18:59:26Z&sp=w"
这就是我使用 Refit 调用 azure blob 服务器的方式:
var myRefitApi = RestService.For<IMyRefitAPI>("https://myaccount.blob.core.windows.net");
myRefitApi.UploadAsync(photoBytes, sasTokenKey, "image/jpeg"
但是我收到以下错误:
Response status code does not indicate success: 403 (Server failed to
authenticate the request. Make sure the value of Authorization header is
formed correctly including the signature.)
如果我像这样直接调用 SAS url 就可以正常工作
var content = new StreamContent(stream);
content.Headers.Add("Content-Type", "jpeg");
content.Headers.Add("x-ms-blob-type", "BlockBlob");
var task = HttpClient.PutAsync(new Uri(sasTokenUrl), content);
task.Wait();
所以基本上我只是想用 Refit 做同样的事情。 知道如何让 Refit 使用 Azure Blob 存储吗?
谢谢!
[更新] 我现在可以将字节上传到 azure blob 服务器,但字节数据似乎有问题,因为我无法查看图像。这是我用来转换为字节数组的代码。
byte[] bytes;
using (var ms = new MemoryStream())
{
stream.Position = 0;
stream.CopyTo(ms);
ms.Position = 0;
bytes = ms.ToArray();
}
[更新] 通过使用流而不是字节数组修复了它!
这是 Authorization
header 的不正确用法。当您想使用帐户密钥授权请求时,您可以使用 Authorization
header。如果你有 Shared Access Signature
那么你真的不需要这个 header 因为授权信息包含在 SAS 本身中。您可以简单地使用 SAS URL 上传文件。
我看到 %2F 和 %3D,我很好奇改装是否第二次对它们进行编码。尝试在不编码的情况下发送令牌。