字节数组作为自定义HTTP标头编码?

时间:2018-08-28 01:52:33

标签: c# http iis character-encoding http-headers

我想添加以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);
   }

1 个答案:

答案 0 :(得分:1)

从评论中复制。

HTTP标头对显示哪些字符有严格的规定,

https://tools.ietf.org/html/rfc7231#section-6.5.1

UTF8数据的标题可能包含无效字符,这可能会触发400个错误。您可以捕获请求并进行分析(使用浏览器,Fiddler或Wireshark的开发人员工具)。

相反,

Base64是安全的方法。而且诸如基本身份验证之类的标准确实使用Base64来编码用户凭据。