Ich versuche, einen Blob mit Azure Rest API zu setzen. Ich habe eine "GET" Anfrage erfolgreich gemacht, aber ich hatte Probleme mit "PUT" Anfrage. Wenn ich versuche, "PUT" -Anfrage zu machen, bekomme ich einen 404error (ich habe den gleichen Beitrag in stackoverflow gesehen, aber es hat mir nicht geholfen) .ich bin mir nicht sicher, ob die MessageSignature korrekt ist (ich habe MessageSignaturePut versucht, aber nicht funktioniert). Irgendwelche Vorschläge?Azure Rest api setzen Blob
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;
}
Da Sie Shared Access Signatur (SAS) verwenden, können Sie keine Berechtigung Header benötigen. Können Sie mir sagen, wie Sie die Signatur für den gemeinsamen Zugriff erstellt haben? Ich bin daran interessiert, die in SAS enthaltenen Berechtigungen zu kennen. –