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捕获的流量如下:
- Azure Fluent API创建SQL Server时出错 – 缺少x-ms-request-id标头
- Web作业上的Windows Azure管理库认证错误
- Microsoft Service Fabric主机服务(FabricHostSvc)挂起启动
- 502在azure’网站’内请求付款服务
- 服务结构:服务之间的呼叫被延迟了吗?
- C#Web应用程序未通过Azure混合连接连接到本地SQL Server
- 使用Kudu在Azure上部署ASP.NET vNext beta 2
- Azurefunction:仅为新事件配置blob触发器
- Azure webrole循环和“无法加载文件或程序集System.Web.Http 5.2.0.0”