我正在尝试使用 Azure Rest API 放置一个 Blob。我成功发出了“GET”请求,但“PUT”请求出现了问题。当我尝试发出“PUT”请求时,我收到 404 错误(我在 stackoverflow 中看到过相同的帖子,但它对我没有帮助)。我不确定我使用的 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 = "<your access key here>";
string storageAccount = "<your storage account name here>";
string containerName = "<your container name here>";
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捕获的流量如下:
关于c# - Azure Rest api放置blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41829911/