Azure为删除blob抛出403

时间:2017-08-10 03:32:29

标签: azure azure-storage

我使用Azure存储REST API来PUT和DELETE blob。

我使用https://azurestoragesamples.codeplex.com

中的代码

PUT调用正常,但是DELETE调用403。

调试时我可以看到所有标题都设置正确

x-ms-version x-ms-date Authorization

MS文档说如果在blob上有活跃租约,你可以获得403但是在Azure存储UI中查看它显示所有租约状态为Unlocked。

我无法在Azure门户网站上看到这些调用记录的任何地方,以便进行故障排除。

// Call to delete in my controller
var bh = new BlobHelper("accountname", "key");
bh.DeleteBlob("images", filename);

// Bloblhelper.cs
public bool DeleteBlob(string container, string blob)
{
    return Retry<bool>(delegate()
    {
        HttpWebResponse response;

        try
        {
            response = CreateRESTRequest("DELETE", container + "/" + blob).GetResponse() as HttpWebResponse;
            response.Close();
            return true;
        }
        catch (WebException ex)
        {
            if (ex.Status == WebExceptionStatus.ProtocolError &&
                ex.Response != null &&
                (int)(ex.Response as HttpWebResponse).StatusCode == 404)
                return false;

            throw;
        }
    });
}


// RESTHelper.cs
public HttpWebRequest CreateRESTRequest(string method, string resource,     string requestBody = null, SortedList<string, string> headers = null, 
    string ifMatch = "", string md5 = "")
{
    byte[] byteArray = null;
    DateTime now = DateTime.UtcNow;
    string uri = Endpoint + resource;

    HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
    request.Method = method;
    request.ContentLength = 0;
    request.Headers.Add("x-ms-date", now.ToString("R", System.Globalization.CultureInfo.InvariantCulture));
    request.Headers.Add("x-ms-version", "2009-09-19");

    if (IsTableStorage)
    {
        request.ContentType = "application/atom+xml";

        request.Headers.Add("DataServiceVersion", "1.0;NetFx");
        request.Headers.Add("MaxDataServiceVersion", "1.0;NetFx");
    }

    if (headers != null)
    {
        foreach (KeyValuePair<string, string> header in headers)
        {
            request.Headers.Add(header.Key, header.Value);
        }
    }

    if (!String.IsNullOrEmpty(requestBody))
    {
        request.Headers.Add("Accept-Charset", "UTF-8");

        byteArray = Encoding.UTF8.GetBytes(requestBody);
        request.ContentLength = byteArray.Length;
    }

    request.Headers.Add("Authorization", AuthorizationHeader(method, now, request, ifMatch, md5));

    if (!String.IsNullOrEmpty(requestBody))
    {
        request.GetRequestStream().Write(byteArray, 0, byteArray.Length);
    }

    return request;
}

public string AuthorizationHeader(string method, DateTime now, HttpWebRequest request, string ifMatch = "", string md5 = "")
{
    string MessageSignature;

    if (IsTableStorage)
    {
        MessageSignature = String.Format("{0}\n\n{1}\n{2}\n{3}",
            method,
            "application/atom+xml",
            now.ToString("R", System.Globalization.CultureInfo.InvariantCulture),
            GetCanonicalizedResource(request.RequestUri, StorageAccount)
            );
    }
    else
    {
        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
            );
    }
    byte[] SignatureBytes = System.Text.Encoding.UTF8.GetBytes(MessageSignature);
    System.Security.Cryptography.HMACSHA256 SHA256 = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String(StorageKey));
    String AuthorizationHeader = "SharedKey " + StorageAccount + ":" + Convert.ToBase64String(SHA256.ComputeHash(SignatureBytes));
    return AuthorizationHeader;
}

0 个答案:

没有答案