Как установить несколько заголовков с помощью PostAsync в С#?

У меня есть рабочий код:

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

//выше это отлично работает для простого заголовка, например. "Приложения/JSON"

Что мне делать, если я хочу иметь несколько заголовков? Например. добавление пары "myKey", "foo" и "Accept", "image/foo1"

Если я попытаюсь добавить следующее до строки .Result, intellisense жалуется (слово "Заголовки" красным цветом с "Не удается разрешить символ" Заголовки ":

client.Headers.Add("myKey", "foo");
client.Headers.Add("Accept", "image/foo1");

Ответ 1

Вы можете получить доступ к свойству Headers через StringContent:

var content = new StringContent(Request, Encoding.UTF8, header);
content.Headers.Add(...);

Затем передайте StringContent на вызов PostAsync:

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

Ответ 2

Я перестал использовать методы Post/Get * Async в пользу метода 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();

Ответ 3

Вы также можете использовать

var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("headername","headervalue");

Если вы хотите просто установить заголовки для класса HttpClient только один раз. Вот документы MSDN по DefaultRequestHeaders.TryAddWithoutValidation