C# HttpClient请求的自定义头

C# HttpClient请求的自定义头,c#,asp.net,http-headers,dotnet-httpclient,C#,Asp.net,Http Headers,Dotnet Httpclient,如何向HttpClient请求添加自定义头?我正在使用PostAsJsonAsync方法发布JSON。我需要添加的自定义标题是 "X-Version: 1" 这就是我到目前为止所做的: using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://api.clickatell.com/"); client.DefaultRequestHeaders.Accept.Clear();

如何向
HttpClient
请求添加自定义头?我正在使用
PostAsJsonAsync
方法发布JSON。我需要添加的自定义标题是

"X-Version: 1"
这就是我到目前为止所做的:

using (var client = new HttpClient()) {
    client.BaseAddress = new Uri("https://api.clickatell.com/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "xxxxxxxxxxxxxxxxxxxx");
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var response = client.PostAsJsonAsync("rest/message", svm).Result;
}

我已经找到了我问题的答案

client.DefaultRequestHeaders.Add("X-Version","1");
这将为您的请求添加一个自定义头

var request=new-HttpRequestMessage{
var request = new HttpRequestMessage {
    RequestUri = new Uri("[your request url string]"),
    Method = HttpMethod.Post,
    Headers = {
        { "X-Version", "1" } // HERE IS HOW TO ADD HEADERS,
        { HttpRequestHeader.Authorization.ToString(), "[your authorization token]" },
        { HttpRequestHeader.ContentType.ToString(), "multipart/mixed" },//use this content type if you want to send more than one content type
    },
    Content = new MultipartContent { // Just example of request sending multipart request
        new ObjectContent<[YOUR JSON OBJECT TYPE]>(
            new [YOUR JSON OBJECT TYPE INSTANCE](...){...}, 
            new JsonMediaTypeFormatter(), 
            "application/json"), // this will add 'Content-Type' header for the first part of request
        new ByteArrayContent([BINARY DATA]) {
            Headers = { // this will add headers for the second part of request
                { "Content-Type", "application/Executable" },
                { "Content-Disposition", "form-data; filename=\"test.pdf\"" },
            },
        },
    },
};
RequestUri=新Uri(“[您的请求url字符串]”), 方法=HttpMethod.Post, 标题={ {“X-Version”,“1”}//下面是如何添加标题, {HttpRequestHeader.Authorization.ToString(),“[您的授权令牌]”}, {HttpRequestHeader.ContentType.ToString(),“multipart/mixed”},//如果要发送多个内容类型,请使用此内容类型 }, Content=newmultipartcontent{//只是请求发送multipart请求的示例 新对象内容( 新建[您的JSON对象类型实例](…){…}, 新的JsonMediaTypeFormatter(), “application/json”),//这将为请求的第一部分添加“Content-Type”头 新的ByteArrayContent([二进制数据]){ Headers={//这将为请求的第二部分添加头 {“内容类型”,“应用程序/可执行文件”}, {“内容配置”,“表单数据;文件名=\”test.pdf\“”, }, }, }, };
HttpRequestMessage
类中有一个
Headers
属性。您可以在那里添加自定义标头,这些标头将随每个HTTP请求一起发送。另一方面,
HttpClient
类中的
DefaultRequestHeaders
设置要与使用该客户端对象发送的每个请求一起发送的头,因此命名为DefaultRequestHeaders


希望这能让事情变得更清楚,至少对将来看到这个答案的人来说是这样。

以下是一个基于Anubis的答案(这是一个更好的方法,因为它不会修改每个请求的标题),但它更等同于原始问题中的代码:

using Newtonsoft.Json;
...

var client = new HttpClient();
var httpRequestMessage = new HttpRequestMessage
    {
        Method = HttpMethod.Post,
        RequestUri = new Uri("https://api.clickatell.com/rest/message"),
        Headers = { 
            { HttpRequestHeader.Authorization.ToString(), "Bearer xxxxxxxxxxxxxxxxxxx" },
            { HttpRequestHeader.Accept.ToString(), "application/json" },
            { "X-Version", "1" }
        },
        Content = new StringContent(JsonConvert.SerializeObject(svm))
    };

var response = client.SendAsync(httpRequestMessage).Result;


@Liam可能重复:我的问题是如何添加自定义标题。另一个问题是如何添加Headers,我认为我们不应该处理HttpClient。不,没有。应该谨慎地查看此答案,因为默认的请求头随每个请求一起发送。你应该像@Anubis建议的那样构建你的请求。当您创建HttpClient时,应填充DefaultsRequestHeader。这仅适用于您为每个请求实例化新HttpClient的情况。这不是该类的使用方式:它应该是一个静态字段,对所有请求(至少对同一端点的请求)都重用。查看文档和无数的博客帖子。当然,正如@Ruhrpottpatriot所指出的,更改默认头将影响所有请求。@Ruhrpottpatriot为每个请求发送头有什么不对?@ajbeaven没有,不是这样说的。页面顶部的示例显示了应用程序的主要方法,因此,即使处理了HttpClient,也会在应用程序的整个生命周期中使用相同的实例,这一点在文档的后面一点是正确的:“HttpClient打算实例化一次,并在应用程序的整个生命周期中重复使用”。下面这一段是一个建议将HttpClient分配给静态字段的示例。@kamilk,你说得对极了-这个示例让我错了。谢谢你纠正我:)答案非常混乱。。。为什么要为文档、blank.pdf等引入代码?实例化bytearray类以在Content param?@heug Well中传递自定义头。如果你正在寻找标题,你可以看到它。此处显示内容是为了完成图片,因为您很可能希望向请求中添加一些内容。为了避免繁琐,内容很复杂,包含JSON和二进制数据。这样做似乎更简单:使用内容JSON创建StringContent,使用方法和URI创建HTTP消息,然后添加诸如message.headers.add(“x”:“y”)。。。。然后将它们传递到一个响应变量中,如“var response=wait httpClient.SendAsync(message);”@heug我将为furute记住这一点。谢谢在上面接受的答案中,哪一行实际实现了OP请求的标题X-Version?为什么这被认为是公认的答案?不,这并不能使它更清楚。在这两种情况下,您都是在每个请求上发送头-那么有什么区别呢?
headers
是单个
HttpRequestMessage
对象的属性。因此,您可以使用不同的头创建不同的消息
DefaultRequestHeaders
HttpClient
对象的属性;如果通过给定的
HttpClient
发送多条消息,则所有此类消息都将在消息的各个标题中添加相同的
DefaultRequestHeaders
。@RossPresser绝对不会。内容类型是内容标题。同意这是答案。它演示了如何添加OP请求的标头。也回答了我的问题。仅供参考,我认为
HttpRequestHeader.Access
应该是
HttpRequestHeader.Accept
。顺便问一下,svm是什么?@aswzen这是OP的问题-我猜是某种模型。正在序列化的对象。