C#中如何使用PostAsync设置多个头?

30

我有一些可用的代码:

using (var client = new HttpClient())
{
HttpResponseMessage response;
response = client.PostAsync(Url, new StringContent(Request, Encoding.UTF8, header)).Result;
}

//如果只是一个简单的标题,例如"application/json",上面的代码可以正常工作。

如果我想要多个标题怎么办?例如添加“myKey”,“foo”对和“Accept”,“image/foo1”。

如果在.Result行之前添加以下代码,智能感知会报错(单词“Headers”是红色的,并显示“无法解析符号'Headers'”):

client.Headers.Add("myKey", "foo");
client.Headers.Add("Accept", "image/foo1");
3个回答

45
你可以通过StringContent访问Headers属性:
var content = new StringContent(Request, Encoding.UTF8, header);
content.Headers.Add(...);

然后将 StringContent 传递给 PostAsync 调用:

response = client.PostAsync(Url, content).Result;

7
好的...这在一定程度上有所帮助(一个标题集合是可以的),但是...我现在遇到了问题:错误使用标题名称。请确保请求标头与HttpRequestMessage一起使用,响应标头与HttpResponseMessage一起使用,内容标头与HttpContent对象一起使用。我不确定哪个标题集合是有问题的,是响应还是内容标头?我该如何添加呢? - n as
我收到了一个错误,说内容头与请求头是分开的。 - Tony

26

我停止使用Post/Get的*异步方法,改用SendAsync(...)方法和HttpRequestMessage, Send Async是大兄弟,可以让你实现完全的灵活性。

using System.Net.Http;

var httpRequestMessage = new HttpRequestMessage();

httpRequestMessage.Method = httpMethod;
httpRequestMessage.RequestUri = new Uri(url);

httpRequestMessage.Headers
                  .UserAgent
                  .Add(new Headers.ProductInfoHeaderValue(
                                              _applicationAssembly.Name, 
                                              _applicationAssembly.Version.ToString()));

HttpContent httpContent = new StringContent(json, Encoding.UTF8, "application/json");
switch (httpMethod.Method)
{
    case "POST":
        httpRequestMessage.Content = httpContent;
        break;
}

var result = await httpClient.SendAsync(httpRequestMessage);
result.EnsureSuccessStatusCode();

1
看起来是一个有趣的方法。我会进行实验。 - n as
1
顺便提一下,在调用栈中不要调用 Task.Wait()。这可能会在 httpClient.SendAsync(httpRequestMessage) 期间导致死锁情况。相反,确保您的堆栈从上到下都是异步/等待或使用线程池中的线程。 - Mr. Young

7
您可以使用以下方式:
var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("headername","headervalue");

如果你想只在HttpClient类中设置一次标头,这里是关于DefaultRequestHeaders.TryAddWithoutValidation的MSDN文档(链接)


一定要使用干净的方法来使用自定义头部,否则你会看到一个异常。 - Farhan Basheer.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接