Azure rest api put blob

我试图用Azure rest api放一个blob。 我成功地提出了“GET”请求,但我遇到了“PUT”请求的问题。 当我尝试发出“PUT”请求时,我得到404错误(我在stackoverflow中看过相同的post,但它没有帮助我)。我不确定我使用的MessageSignature是否正确(我已经尝试过MessageSignaturePut但没有工作)。 有什么建议?

public void UploadBlobWithRestAPI(string uri, DateTime now) { string blobName = "test.txt"; string method = "PUT"; string sampleContent = "This is sample text."; int contentLength = Encoding.UTF8.GetByteCount(sampleContent); string queryString = (new Uri(uri)).Query; string blobContainerUri = uri.Substring(0, uri.Length - queryString.Length); string requestUri = string.Format(CultureInfo.InvariantCulture, "{0}/{1}{2}", blobContainerUri, blobName, queryString); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri); string nnow = now.ToString("R", System.Globalization.CultureInfo.InvariantCulture); request.Method = method; request.Headers.Add("x-ms-version", "2015-02-21"); request.Headers.Add("x-ms-date", nnow); request.ContentType = "text/plain; charset=UTF-8"; request.Headers.Add("x-ms-blob-type", "BlockBlob"); request.ContentLength = contentLength; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(Encoding.UTF8.GetBytes(sampleContent), 0, contentLength); } request.Headers.Add("Authorization", AuthorizationHeader(method, now, request, "", "")); using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse()) { MessageBox.Show(resp.StatusCode.ToString()); } } public string AuthorizationHeader(string method, DateTime now, HttpWebRequest request, string ifMatch = "", string md5 = "") { string MessageSignature; string StorageKey = "xxx"; string StorageAccount = "upgradedevstorage"; MessageSignature = String.Format("{0}\n\n\n{1}\n{5}\n\n\n\n{2}\n\n\n\n{3}{4}", method, (method == "GET" || method == "HEAD") ? String.Empty : request.ContentLength.ToString(), ifMatch, GetCanonicalizedHeaders(request), GetCanonicalizedResource(request.RequestUri, StorageAccount), md5 ); ??? //string MessageSignaturePut= String.Format("{0}\n\n{1}\n\n{2}{3}", // method, // "text/plain; charset=UTF-8", // GetCanonicalizedHeaders(request), // GetCanonicalizedResource(request.RequestUri, StorageAccount) // ); byte[] SignatureBytes = System.Text.Encoding.UTF8.GetBytes(MessageSignature); System.Security.Cryptography.HMACSHA256 SHA256 = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String(StorageKey)); string signature = Convert.ToBase64String(SHA256.ComputeHash(SignatureBytes)); string AuthorizationHeader = "SharedKey " + StorageAccount + ":" + Convert.ToBase64String(SHA256.ComputeHash(SignatureBytes)); return AuthorizationHeader; } 

请考虑以下代码段。 这应该适合你。

 void UploadBlobWithRestAPI() { string storageKey = ""; string storageAccount = ""; string containerName = ""; string blobName = "test.txt"; string method = "PUT"; string sampleContent = "This is sample text."; int contentLength = Encoding.UTF8.GetByteCount(sampleContent); string requestUri = $"https://{storageAccount}.blob.core.windows.net/{containerName}/{blobName}"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri); string now = DateTime.UtcNow.ToString("R"); request.Method = method; request.ContentType = "text/plain; charset=UTF-8"; request.ContentLength = contentLength; request.Headers.Add("x-ms-version", "2015-12-11"); request.Headers.Add("x-ms-date", now); request.Headers.Add("x-ms-blob-type", "BlockBlob"); request.Headers.Add("Authorization", AuthorizationHeader(method, now, request, storageAccount, storageKey, containerName, blobName)); using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(Encoding.UTF8.GetBytes(sampleContent), 0, contentLength); } using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse()) { MessageBox.Show(resp.StatusCode.ToString()); } } public string AuthorizationHeader(string method, string now, HttpWebRequest request, string storageAccount, string storageKey, string containerName, string blobName) { string headerResource = $"x-ms-blob-type:BlockBlob\nx-ms-date:{now}\nx-ms-version:2015-12-11"; string urlResource = $"/{storageAccount}/{containerName}/{blobName}"; string stringToSign = $"{method}\n\n\n{request.ContentLength}\n\n{request.ContentType}\n\n\n\n\n\n\n{headerResource}\n{urlResource}"; HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String(storageKey)); string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign))); String AuthorizationHeader = String.Format("{0} {1}:{2}", "SharedKey", storageAccount, signature); return AuthorizationHeader; } 

而Fiddler捕获的流量如下:

在此处输入图像描述