Azure blob授权标头
我正在尝试从Xamarin iOS应用程序使用refit上传到azure blob存储。 这是我用于改装的接口configuration:
[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"
这是我如何使用重新调用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.)
如果我直接调用它,SASurl工作正常
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做同样的事情。 任何想法如何得到改装与Azure的Blob存储工作?
谢谢!
[更新]我现在能够上传到azure blob服务器的字节,但似乎是错误的字节数据,因为我无法查看图像。 这是我用来转换为字节数组的代码。
byte[] bytes; using (var ms = new MemoryStream()) { stream.Position = 0; stream.CopyTo(ms); ms.Position = 0; bytes = ms.ToArray(); }
[更新]通过使用stream而不是字节数组得到了修复!
我看到%2F和%3D,我很好奇,如果改装是第二次编码。 尝试发送令牌而不进行编码。
这是Authorization
标头的不正确使用。 当您要使用帐户密钥授权请求时,您使用Authorization
标头。 如果你有Shared Access Signature
那么你真的不需要这个头文件,因为授权信息包含在SAS本身中。 您可以简单地使用SAS URL来上传文件。