如何使用 System.Net.Http.HttpClient 为 Azure Table 存储正确设置 content.Headers.ContentMD5 属性

How to properly set content.Headers.ContentMD5 property using System.Net.Http.HttpClient for Azure Table Storage

我使用 REST API for Azure Table 存储 HttpWebRequest 成功。

现在我正在尝试将应用程序移植到 System.Net.Http.HttpClient Classes.

为了使用 sharedKey 方法进行身份验证,Content-MD5 header 设置为

content.Headers.Add("Content-MD5", hashString);

这也适用于带有 HttpClient 类 的 UWP,但不适用于 iOS(在使用 Fiddler 捕获的请求中,Content-MD5 的值 header 为空。

在 HttpClient 中现在有一个 content.Headers.ContentMD5 属性 应该被使用。

但是,我无法以 Fiddler 向我显示 UWP 解决方案中的 Content-MD5 header 相同值的方式设置此 属性。 这是我的代码:

string contentString = "<some xml content>";

       // alternative hash function working on all platforms
       // byte[] hash = xBrainLab.Security.Cryptography.MD5.GetHash  (contentString);
       // string hashString = xBrainLab.Security.Cryptography.MD5.GetHashString(contentString);

        System.Security.Cryptography.MD5CryptoServiceProvider csp = new MD5CryptoServiceProvider();

        var hash = csp.ComputeHash(Encoding.UTF8.GetBytes(contentString));

        var hashString = ByteArrayToString(hash);  // is "AABB88AFD4056C0B8E4FEB6B433D5EE9"

        System.Net.Http.HttpClient client = new HttpClient();
        Uri uri = new Uri("http://woschmi01.table.core.windows.net/Test2018()");
        HttpRequestMessage requestMessage = new HttpRequestMessage(new HttpMethod("PUT"), uri);
        var content = new StringContent(contentString);

        // former solution, works on UWP but not on iOS
        content.Headers.Add("Content-MD5", hashString);

        // solution I'm trying to get working:

        // content.Headers.ContentMD5 = hash;                // What has to be taken as content.Headers.ContentMD5 property   ?????


        var response = SendRequest(client, uri, content);


        for ( int i = 0; i < 5; i++)
        {
            Thread.Sleep(1000);
        }

//****************************************
async Task<HttpResponseMessage> SendRequest(HttpClient client, Uri uri,    StringContent content)
        {
            HttpResponseMessage response =  await client.PostAsync(uri, content);
            return response;}

//**************************************       
 static string ByteArrayToString(byte[] ba)
    {
        return BitConverter.ToString(ba).Replace("-", "");
    }

在搜索了很多小时的解决方案并制定了这个问题之后,我终于自己找到了答案:

 content.Headers.ContentMD5 =  Convert.FromBase64String(hashString);