使用 c# http 客户端时请求 headers 必须仅包含 ASCII 字符?

Request headers must contain only ASCII characters while using c# http client?

我正在使用 HttpClient 通过传递 header 进行 POST 调用,但在某个时间点我收到错误消息:

Request headers must contain only ASCII characters.

堆栈跟踪为:

at System.Net.Http.HttpConnection.WriteStringAsync(String s)
   at System.Net.Http.HttpConnection.WriteHeadersAsync(HttpHeaders headers, String cookiesFromContainer)
   at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithNtConnectionAuthAsync(HttpConnection connection, HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)

这是我的代码:

public HttpWrapper(string endpoint, Func<IDictionary<string, string>> NewHeader)
{
    _httpClient = new HttpClient();
    _httpClient.BaseAddress = new Uri(endpoint);

    if (NewHeader != null)
    {
        var headers = NewHeader();
        foreach (var header in headers)
        {
            _httpClient.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, header.Value);
        }
    }
}

我需要对 header.Value 做些什么来解决这个问题吗?我在网上阅读所以看起来我需要在这里使用 Utf-8 但不确定如何正确使用它?

更新

我今天得到了这样的 header 值,它抛出了同样的异常,因为 HttpUtility.HtmlEncode 没有对它做任何事情。另外我不确定这个字符 <0x94> 是什么?知道为什么会这样吗?

我也不确定

您可以尝试将 header 值编码为 HTML:

_httpClient.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, HttpUtility.HtmlEncode(header.Value));

您的字符串 Ergänzendes 将为“Erg&#228;nzendes”。

我希望这对您的特定情况或其他有类似情况的人有所帮助。 就我而言,我的 header 包含 非 ASCII 字符,因为 Headers 值之一是通过创建 sha256 HMAC.这是我试图发送请求的服务的要求。 因此,为了将这些字符 编码 为 ASCII,我必须做的就是:

//hashedSignature is the one containing NON ASCII charcters!
string MessageSignatureValue = System.Text.Encoding.ASCII.GetString(hashedSignature); 
httpClient.DefaultRequestHeaders.Add(MessageSignaturField, MessageSignatureValue);

我刚刚包含了重要的代码片段。

所以,System.Text.Encoding.ASCII.GetString() 方法成功了!

再说一遍,希望对你有帮助。