使用 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ä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() 方法成功了!
再说一遍,希望对你有帮助。
我正在使用 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ä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() 方法成功了!
再说一遍,希望对你有帮助。