我正在使用 javascript 与第三方服务进行通信。作为身份验证过程的一部分,他们需要发布消息的“多部分/表单”正文,包括要在 md5 中加密的图像,将其添加到包含日期和其他一些内容的字符串中,然后运行 HMAc/SHA1在上面。所以最后他们拥有多部分正文、日期和身份验证哈希,以便进行身份验证,然后读取图像。
这适用于除 windowsPhone 之外的所有移动设备..(我知道,IE 有问题......谁会想到?)。他们的 httpwebrequest 不包含“日期” header ..所以没有身份验证。这意味着我必须为 windows phone 原生使用 C# 中新发布的 httpclient 代码。现在我是 C# 菜鸟,所以这可能是简单的解决方案所在。我已经通过将几乎所有内容传递给 c# 并仅使用 c# 进行发布来获得身份验证,但他们无法读取正文,因为我发现发送边界的唯一方法是将内容定义为 multipartformDatacontent 并发送内容方式更改正文,因此身份验证失败。
我的 javascript 是这样的:
var boundary = "------------ThIs_Is_tHe_bouNdaRY_";
var part1Array = [];
var part1 = "--"+boundary + "\r\n"+
"Content-Disposition: form-data; name=\"image\"\r\n"+
"Content-Type: image/jpg\r\n"+
"\r\n";
var part3Array = [];
var part3 = "\r\n" + boundary +"--";
for(var p1=0; p1<part1.length; p1++){
part1Array.push(part1.charCodeAt(p1));
}
for(var p3=0; p3<part3.length; p3++){
part3Array.push(part3.charCodeAt(p3));
}
var bodyContent = part1Array.concat(imageArray,part3Array);
//hash this
var authMessage = bodyContentHash +"\n"+ contentType +"\n"+ todayString +"\n"+ pathandstuff;
// -hmac -sha1 -base64
C# 是:
HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, path);
request.Headers.Date = DateTime.ParseExact(todaydate, "ddd',' dd MMM yyyy HH:mm:ss 'GMT'", new CultureInfo("en-US"), DateTimeStyles.AssumeUniversal);
request.Headers.Add("Accept", "application/json; charset=utf-8");
request.Headers.Add("Authorization", auth);
byte[] body = Convert.FromBase64String(bodyData);
request.Content = new ByteArrayContent(body);
request.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");
request.Content.Headers.Add("boundary", "------------ThIs_Is_tHe_bouNdaRY_");
HttpResponseMessage response = client.SendAsync(request).Result;
string resultCode = response.StatusCode.ToString();
string responseBodyAsText = await response.Content.ReadAsStringAsync();
这非常有效.. 正文内容和标题都是正确的.. 除了内容类型标题应该是:
request.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data, boundary=------------ThIs_Is_tHe_bouNdaRY_");
除了这会引发 System.FormatException 错误。
最佳答案
我们通过在没有验证的情况下手动清除并重新添加内容类型来解决这个问题 MediaTypeHeaderValue() 类似乎不喜欢边界标记。
而不是使用:
content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data; boundary=----FLICKR_MIME_20140415120129--");
我们做了以下事情:
content.Headers.Remove("Content-Type");
content.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=----FLICKR_MIME_20140415120129--");
一旦我们做出这个改变,它就可以正常工作了。
(请注意,如果有任何不同,这是在 WinRT 上)
关于c# - HttpClient 设置边界与内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18500040/