我成功地使用了 Azure 表HttpWebRequest
存储的 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("-", "");
}
在搜索了几个小时的解决方案并提出这个问题之后,我终于自己找到了答案:
content.Headers.ContentMD5 = Convert.FromBase64String(hashString);