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

Posted

技术标签:

【中文标题】如何使用 System.Net.Http.HttpClient 为 Azure 表存储正确设置 content.Headers.ContentMD5 属性【英文标题】:How to properly set content.Headers.ContentMD5 property using System.Net.Http.HttpClient for Azure Table Storage 【发布时间】:2018-05-25 11:21:41 【问题描述】:

我成功地使用 HttpWebRequest 的 Azure 表存储 REST API。

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

对于使用 sharedKey 方法的身份验证,Content-MD5 标头设置为

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

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

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

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

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("-", "");
    

【问题讨论】:

【参考方案1】:

在寻找解决方案数小时并提出这个问题后,我终于自己找到了答案:

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

【讨论】:

以上是关于如何使用 System.Net.Http.HttpClient 为 Azure 表存储正确设置 content.Headers.ContentMD5 属性的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?