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来上传文件。