首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用c# http客户端时,请求标头必须只包含ASCII字符?

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

Stack Overflow用户
提问于 2020-11-11 18:28:38
回答 2查看 10.4K关注 0票数 7

我使用HttpClient通过传递标头进行POST调用,但是在某个时候,我收到了一个错误,如下所示:

代码语言:javascript
运行
复制
Request headers must contain only ASCII characters.

使用堆栈跟踪,如:

代码语言:javascript
运行
复制
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)

这是我的代码:

代码语言:javascript
运行
复制
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>是什么?有什么想法吗?为什么会这样?

而且我也不确定

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-11 18:39:31

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

代码语言:javascript
运行
复制
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, HttpUtility.HtmlEncode(header.Value));

您的字符串Erg nzendes将是"Erg&#228;nzendes“。

票数 3
EN

Stack Overflow用户

发布于 2020-11-16 17:21:48

我希望这可能有助于您的具体情况或其他类似的情况。在我的例子中,我的头包含非ASCII字符,因为其中一个标头值是通过创建sha256 HMAC生成的。这是我试图发送请求的服务部门的一个要求。所以,为了使--这些字符编码为ASCII --我必须做的就是:

代码语言:javascript
运行
复制
//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()方法做到了这一点!

再说一次,我希望这能帮上忙。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64792110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档