我使用HttpClient
通过传递标头进行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,但不确定如何正确地做到这一点?
更新
我今天得到了这样的头值,它抛出了同样的异常,因为HttpUtility.HtmlEncode
没有对它做任何事情。我也不知道这个角色<0x94>
是什么?有什么想法吗?为什么会这样?
而且我也不确定
发布于 2020-11-11 18:39:31
您可以尝试将标题值编码为HTML:
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, HttpUtility.HtmlEncode(header.Value));
您的字符串Erg nzendes将是"Ergänzendes
“。
发布于 2020-11-16 17:21:48
我希望这可能有助于您的具体情况或其他类似的情况。在我的例子中,我的头包含非ASCII字符,因为其中一个标头值是通过创建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()方法做到了这一点!
再说一次,我希望这能帮上忙。
https://stackoverflow.com/questions/64792110
复制相似问题