【问题标题】:How to set HttpHeader on individual request using HttpClient如何使用 HttpClient 在单个请求上设置 HttpHeader
【发布时间】:2017-07-04 10:55:24
【问题描述】:

我有一个在多个线程之间共享的HttpClient

public static class Connection
{
    public static HttpClient Client { get; }

    static Connection()
    {
        Client = new HttpClient
        {
            BaseAddress = new Uri(Config.APIUri)
        };

        Client.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
        Client.DefaultRequestHeaders.Add("Keep-Alive", "timeout=600");
        Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }
}

它有一些我放在每个请求上的默认标头。但是,当我使用它时,我想为 just 该请求添加一个标头:

var client = Connection.Client;
StringContent httpContent = new StringContent(myQueueItem, Encoding.UTF8, "application/json");

httpContent.Headers.Add("Authorization", "Bearer " + accessToken); // <-- Header for this and only this request
HttpResponseMessage response = await client.PostAsync("/api/devices/data", httpContent);
response.EnsureSuccessStatusCode();

string json = await response.Content.ReadAsStringAsync();

当我这样做时,我得到了异常:

{"错误使用的标头名称。确保请求标头与 HttpRequestMessage,带有 HttpResponseMessage 的响应标头,以及 带有 HttpContent 对象的内容标头。"}

我找不到向此请求添加请求标头的其他方法。如果我修改Client 上的DefaultRequestHeaders,我会遇到线程问题并且必须实现各种疯狂的锁定。

有什么想法吗?

【问题讨论】:

    标签: c# .net http-headers webclient


    【解决方案1】:

    您可以使用SendAsync 发送HttpRequestMessage

    您可以在消息中设置urimethodcontentheaders

    例子:

    HttpRequestMessage msg = new HttpRequestMessage(HttpMethod.Post, "/api/devices/data");
    msg.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
    msg.Content = new StringContent(myQueueItem, Encoding.UTF8, "application/json");
    
    HttpResponseMessage response = await client.SendAsync(msg);
    response.EnsureSuccessStatusCode();
    
    string json = await response.Content.ReadAsStringAsync();
    

    【讨论】:

    • 太棒了!这样可行。我也将我的工作代码添加到您的答案中。 +1
    • 这实际上对我不起作用——代码可以编译,但是当我运行它时,我得到一个异常,上面写着“错误的标头名称。确保请求标头与 HttpRequestMessage、响应标头一起使用带有 HttpResponseMessage,以及带有 HttpContent 对象的内容标头。”如果尝试设置它,不确定在请求上设置 Authorization 标头有什么意义,但如果我找到解决方法,我会更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多