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

And*_*dyP 5 c# dotnet-httpclient

我正在使用HttpClient通过传递标头进行 POST 调用,但在某些时候我收到如下错误:

Request headers must contain only ASCII characters.
Run Code Online (Sandbox Code Playgroud)

使用堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

更新

我今天得到了这样的标头值,它抛出了同样的异常,因为HttpUtility.HtmlEncode它没有做任何事情。另外我不确定这个角色是<0x94>什么?任何想法为什么会发生?

我也不确定

在此处输入图片说明

Yig*_*sel 3

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

\n
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, HttpUtility.HtmlEncode(header.Value));\n
Run Code Online (Sandbox Code Playgroud)\n

您的字符串 Erg\xc3\xa4nzendes 将是“ Erg&#228;nzendes”。

\n