我想添加以utf8编码(Encoding.UTF8.GetString)编码的自定义HTTP标头(散列并签名)。将数据发布到 IIS 时,遇到 错误的请求(400)错误。
如果自定义HTTP标头使用base64编码进行编码,则没有问题。 但是我们的合作伙伴坚持使用utf8编码。
我想知道此“错误请求(400)”是否仅由IIS引起?
这是代码:
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
HttpRequestMessage msg = new HttpRequestMessage(HttpMethod.Post,
"https://putsreq.com/AIWKVacHh2ok5FMGFpEg");
var reqBody = "{'hello': 'world'}";
msg.Content = new StringContent(reqBody);
msg.Content.Headers.ContentType = new
MediaTypeWithQualityHeaderValue("application/json");
var signature = SignMessage(reqBody); //hash and sign the message using
//private key
var signatureString = Encoding.UTF8.GetString(signature);
msg.Headers.Add("signature", signature);
try{
var response = await client.SendAsync(msg);
response.EnsureSuccessStatusCode();
//Continue if success
}catch(Exception ex){
Trace.WriteLine("Exception: " + ex);
}
答案 0 :(得分:1)
从评论中复制。
HTTP标头对显示哪些字符有严格的规定,
https://tools.ietf.org/html/rfc7231#section-6.5.1
UTF8数据的标题可能包含无效字符,这可能会触发400个错误。您可以捕获请求并进行分析(使用浏览器,Fiddler或Wireshark的开发人员工具)。
相反,Base64是安全的方法。而且诸如基本身份验证之类的标准确实使用Base64来编码用户凭据。