如何在 .Net Core 中使用 REST API 访问 azure table 存储

How to access azure table storage using REST API in .Net Core

我想从 azure table 存储访问数据,但我无法使用 Net core 访问。但是使用 .Net Framework 是可能的。

以下代码是用.Net Framework 编写的

var sharedKey = Convert.FromBase64String("AccountKey");
        var request = WebRequest.Create("http://accountname.table.core.windows.net/tablename");
        request.ContentLength = 0;
        request.Headers.Add("x-ms-date", DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture));
        var resource = request.RequestUri.PathAndQuery;
        if (resource.Contains("?"))
        {
            resource = resource.Substring(0, resource.IndexOf("?"));
        }

        string stringToSign = string.Format("{0}\n/{1}{2}",
                request.Headers["x-ms-date"],
                 "accountname",
                resource
            );
        var hasher = new HMACSHA256(sharedKey);
        string signedSignature = Convert.ToBase64String(hasher.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
        string authorizationHeader = string.Format("{0} {1}:{2}", "SharedKeyLite", "accountname", signedSignature);
        request.Headers.Add("Authorization", authorizationHeader);
        var response = request.GetResponse();
        return response;

据我所知,.Net Core 和 .Net Standard 在使用 REST 时存在一些差异 API。

  1. 在 .NET 4.5 中,您必须在 HttpWebRequest object 并且您不能只在 header 中设置它们。 好吧,在核心他们决定改变方向,你必须使用 header collection.

    .NET 核心: request.Headers["x-ms-version"] = "2015-04-05";

    .NET 4.5: request.Headers.Add("x-ms-version", "2015-04-05");

  2. .NET Core 只支持 WebResponse.GetResponseAsync() 方法,所以 您只能使用异步方式获取结果。

    如下图: Task<WebResponse> response = request.GetResponseAsync(); HttpWebResponse responseresult = (HttpWebResponse)response.Result;

更多详情,您可以参考以下代码:

string storageAccount = "storageAccount";
        string accessKey = "accessKey";
        string resourcePath = "TableSample()";
        string uri = @"https://" + storageAccount + ".table.core.windows.net/" + resourcePath;
        // Web request 
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
        request.Method = "GET";
        request.ContentType = "application/json";
        request.Accept = "application/json;odata=nometadata";
        request.Headers["x-ms-date"] = DateTime.UtcNow.ToString("R", System.Globalization.CultureInfo.InvariantCulture);
        request.Headers["x-ms-version"] = "2015-04-05";
        string stringToSign = request.Headers["x-ms-date"] + "\n"; 
        int query = resourcePath.IndexOf("?");
        if (query > 0)
        {
            resourcePath = resourcePath.Substring(0, query);
        }
        stringToSign += "/" + storageAccount + "/" + resourcePath;
        System.Security.Cryptography.HMACSHA256 hasher = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String(accessKey));
        string strAuthorization = "SharedKeyLite " + storageAccount + ":" + System.Convert.ToBase64String(hasher.ComputeHash(System.Text.Encoding.UTF8.GetBytes(stringToSign)));


        request.Headers["Authorization"] = strAuthorization;

        Task<WebResponse> response = request.GetResponseAsync();
        HttpWebResponse responseresult = (HttpWebResponse)response.Result;

            using (System.IO.StreamReader r = new System.IO.StreamReader(responseresult.GetResponseStream()))
            {
                string jsonData = r.ReadToEnd();
                Console.WriteLine(jsonData);
           }
        Console.ReadLine();

结果: