Изменение заголовков запросов для каждого запроса C# HttpClient PCL

В настоящее время я использую System.Net.Http.HttpClient для межплатформенной поддержки.

Я читал, что не рекомендуется создавать экземпляр объекта HttpClient для каждого запроса и что вы должны использовать его повторно, когда это возможно.

Теперь у меня возникла проблема при написании клиентской библиотеки для службы. Некоторые вызовы API должны иметь определенный заголовок, некоторые НЕ ДОЛЖНЫ включать этот конкретный заголовок.

Кажется, я могу манипулировать только «DefaultRequestHeaders», которые будут отправляться с каждым запросом.

Есть ли вариант при фактическом выполнении запроса, например. «client.PostAsync ()» для изменения заголовков только для конкретного запроса?

(Информация: запросы могут быть многопоточными).

Заранее спасибо!


person coalmee    schedule 07.05.2014    source источник


Ответы (2)


Да, вы можете создать новый HttpRequestMessage, задать все необходимые свойства, а затем передать его в SendAsync.

var request = new HttpRequestMessage() {
   RequestUri = new Uri("http://example.org"),
   Method = HttpMethod.Post,
   Content = new StringContent("Here is my content")
}
request.Headers.Accept.Add(...);  // Set whatever headers you need to

var response = await client.SendAsync(request);
person Darrel Miller    schedule 07.05.2014
comment
@user2864740 user2864740 Странно. Он должен быть как в версии .net 4.5.1, так и в версии PCL msdn.microsoft.com/en-us/library/ - person Darrel Miller; 01.12.2015
comment
О, моя ошибка.. Я смотрел на Get.. :} - person user2864740; 01.12.2015
comment
@DarrelMiller, что происходит, когда клиент выдает несколько сообщений HttpRequestMessages? Например, токен доступа должен быть передан в заголовке для обращения к API, я делаю запрос, а затем вы делаете запрос (мы оба являемся пользователями клиентского сайта) — экземпляр HttpClient используется совместно между запросами, поскольку его статический . Допустим, мой запрос занимает больше времени, чем ваш, это вызывает проблемы? - person crizzwald; 30.11.2016
comment
@crizzwald Нет. Метод SendAsync является потокобезопасным. Каждый из нескольких потоков может отправлять свой собственный экземпляр HttpRequestMessage одному и тому же экземпляру HttpClient. Правильная задача будет продолжена после получения ответа. - person Darrel Miller; 30.11.2016
comment
@DarrelMiller, о, это круто. это полностью решает проблему TIME_WAIT, о которой я читал, и теперь HttpClient можно использовать с высокой степенью масштабируемости. Благодарность!! - person crizzwald; 30.11.2016
comment
Вы только что спасли мой день с этой чертовой документацией, в которой отсутствует эта информация! - person Francesco Cristallo; 11.09.2017
comment
@FrancescoC. В нашей книге по WebAPI есть глава о HttpClient. Он доступен бесплатно на сайте chimera.labs.oreilly.com/books/1234000001708/ch14. html Там может быть полезная информация. - person Darrel Miller; 11.09.2017

Используйте HttpContent. Заголовки. Просто создайте экземпляр HttpContent с необходимыми заголовками и передайте его Постасинхронный метод.

person SuMMeR    schedule 07.05.2014
comment
Это не сработает, поскольку заголовки являются заголовками request, а не заголовками контента. - person easuter; 11.09.2015