Azure REST WebClient PUT Blob

dan*_*ord 3 rest webclient azure azure-storage azure-storage-blobs

我正在尝试使用WebClient将新Blob上传到Azure存储计数器,如下所示:

var sas = "[a new generated sas with Read, Write, List & Delete permissions]";
var sData = "This is a test!";
var sEndPoint = "http://myaccount.blob.core.windows.net/mycontainer/MyTest.txt" + sas;

var clt = new WebClient();
var res = await clt.UploadStringTaskAsync(sEndPoint, "PUT", sData);
Run Code Online (Sandbox Code Playgroud)

这给了我一个"(400)错误请求".错误.我在这里做错了吗?

谢谢

(顺便说一下,我需要使用REST而不是Client API,因为我在Silverlight项目中)

Gau*_*tri 7

您需要x-ms-blob-type为blob类型定义请求标头()并将其值设置为BlockBlob.同样对于Put请求,您还需要定义Content-Length请求标头.我写了一篇关于共享访问签名的博客文章,并使用它(使用REST API和存储客户端库)执行一些blob操作,您可以在这里阅读:http://gauravmantri.com/2013/02/13/revisiting-windows- azure-shared-access-signature /.

这是关于上传b​​lob的帖子的代码.它使用HttpWebRequest/HttpWebResponse而不是WebClient:

static void UploadBlobWithRestAPISasPermissionOnBlobContainer(string blobContainerSasUri)
{
    string blobName = "sample.txt";
    string sampleContent = "This is sample text.";
    int contentLength = Encoding.UTF8.GetByteCount(sampleContent);
    string queryString = (new Uri(blobContainerSasUri)).Query;
    string blobContainerUri = blobContainerSasUri.Substring(0, blobContainerSasUri.Length - queryString.Length);
    string requestUri = string.Format(CultureInfo.InvariantCulture, "{0}/{1}{2}", blobContainerUri, blobName, queryString);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri);
    request.Method = "PUT";
    request.Headers.Add("x-ms-blob-type", "BlockBlob");
    request.ContentLength = contentLength;
    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(Encoding.UTF8.GetBytes(sampleContent), 0, contentLength);
    }
    using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
    {

    }
}
Run Code Online (Sandbox Code Playgroud)