Я посмотрел на исходный код MS в соответствии с их интерпретацией, сам HttpClient не имеет «типа контента», только контент должен иметь тип контента. Кажется логичным, за исключением случаев, когда вы имеете дело с MultipartFormDataContent. MultipartFormDataContent полностью игнорирует следующий код:
string boundary = "--" + GenerateRandomString();
using (var content = new MultipartFormDataContent(boundary))
{
content.Headers.ContentType = new MediaTypeHeaderValue($"multipart/form-data");
content.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("boundry", boundary));
...
}
В запросе отсутствует "Content-Type". А также игнорирует:
string boundary = "--" + GenerateRandomString();
using (var content = new MultipartFormDataContent(boundary))
{
content.Headers.Remove("Content-Type");
content.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary);
...
}
Попытка установить его на HttpClient
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary);
выдает следующую ошибку:
System.InvalidOperationException: 'Misused header name. Make sure request headers are used with HttpRequestMessage, response headers with HttpResponseMessage, and content headers with HttpContent objects.'
Я могу найти множество примеров того, как это сделать с помощью StringContent, но ни одного с MultipartFormDataContent. MultipartFormDataContent позволяет установить Content-Type и Content-Disposition для каждого поля, мне это нужно больше на уровне клиента. Мне нужен заголовок, который выглядит примерно так:
accept: application/json
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Basic ZXlKbGRDSTZJakUxTWpZNU9UTXpOTnpkMjl5WkNJNklqa3haRGxtWkdKa1lUazRaVEJqWmpsalpUaGxNV1V3TXpOalxuWmpCbE1tVXhJaXdpZFhObGNpSTZJbUZrYldsdUluMD1cbjo=
Cache-Control: no-cache
Многие не-Microsoft API требуют тега «граница», чтобы он мог различать отдельные поля отправляемых данных. Проверка здесь по запросу кажется немного чрезмерной. Даже TryAddWithoutValidation не работает (может баг?). Я понимаю, что, возможно, можно интерпретировать RFC7578 таким образом, который говорит, что это не должно требоваться, но категорически не позволять этого мне тоже не кажется правильным. Кто-нибудь еще сталкивался с этой проблемой и решал ее.
MultipartFormDataContent
уже сам по себе правильно устанавливает заголовок Content-Type (с границей), так что никаких дополнительных усилий не требуется? Я только что протестировалHttpClient
в .NET 4.6, и он отлично отправляет Content-Type. - person Evk   schedule 23.05.2018MultipartFormDataContent
, даже если вызовHttpClient.PostAsync
находится в библиотеке .NET Standard 2.0. Граница есть, как и тип контента. Никаких манипуляций с заголовком не потребовалось - person Panagiotis Kanavos   schedule 24.05.2018