После прочтения HttpClient
и соответствующего исходного кода вы никак не сможете обойти это и добавить заголовок к фактическим заголовкам объекта запроса. Существует внутренний список недопустимых заголовков, который включает любые заголовки Content-*
. Он должен быть на объекте контента.
Поэтому я предлагаю создать собственный объект контента:
public class NoContentMd5 : HttpContent
{
protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
return Task.CompletedTask;
}
protected override bool TryComputeLength(out long length)
{
length = 0;
return false;
}
public NoContentMd5(byte[] contentMd5)
{
this.Headers.ContentMD5 = contentMd5;
}
public NoContentMd5(string contentMd5)
{
this.Headers.TryAddWithoutValidation("Content-MD5", contentMd5);
}
}
Это добавит заголовок Content-MD5
со значением вашего выберите, но запрос не будет содержать тела.
Следующая проблема, с которой вы столкнетесь, заключается в том, что вы пытаетесь выполнить запрос GET с содержимым, которое не поддерживается помощником client.GetAsync(...)
метод. Вам придется создать свой собственный объект запроса и использовать вместо него client.SendAsync(...)
:
HttpClient client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://localhost/my/test/uri");
request.Content = new NoContentMd5("d41d8cd98f00b204e9800998ecf8427e ");
var result = await client.SendAsync(request);
Обратите внимание, что если у вас Content-MD5 ha sh в качестве байтов, я также добавил конструктор в NoContentMd5
для byte[]
тоже.
Единственная потенциальная проблема, связанная с этим, заключается в том, что она включает заголовок Content-Length: 0
. Надеюсь, с API, с которым вы работаете, все в порядке.
Существует альтернативное решение, описанное в в этом ответе на вопрос с похожей проблемой. Я бы поспорил против его использования, поскольку он уязвим к изменениям в деталях реализации HttpRequestHeaders
(потому что он использует отражение, поэтому, если MS изменит код, он может сломаться).