Я преобразуя HttpContent
в следующем DTO:HttpContent Заголовки несовместимого перечисление
public class ContentDto
{
public string ContentType {get; set;}
public string Headers {get; set; }
public object Data { get; set; }
public ContentDto(HttpContent content)
{
Headers = content.Headers.Flatten();
// rest of the setup
}
}
И я бег несколько модульных тестов на нем:
[Fact]
public void CanBuild()
{
var content = new StringContent("some json", Enconding.UTF8, "application/json");
var dto = new ContentDto(content);
var contentHeaders = content.Headers.Flatten();
Assert.Equal(contentHeaders, dto.Headers);
}
И что тест не пройден, так как заголовок Content-Length
не является захвачен на моем д. Однако, если я это сделаю:
[Fact]
public void CanBuild()
{
var content = new StringContent("some json", Enconding.UTF8, "application/json");
var contentHeaders = content.Headers.Flatten();
var dto = new ContentDto(content);
Assert.Equal(contentHeaders, dto.Headers);
}
Тест проходит, и все заголовки захватываются. Еще я попытался это:
[Fact]
public void CanBuild()
{
var content = new StringContent("some json", Enconding.UTF8, "application/json");
var dto = new ContentDto(content);
var contentHeaders = content.Headers.Flatten();
var dto1 = new ContentDto(content);
Assert.Equal(contentHeaders, dto.Headers);
Assert.Equal(contentHeaders, dto1.Headers);
}
и он терпит неудачу, поскольку dto
не имеет заголовок Content-Length
, но dto1
делает. Я даже пытался получать заголовки внутри на заводе, как метод, как это:
public static ContentDto FromContent<T>(T content) where T : HttpContent
{
// same as the constructor
}
, чтобы увидеть, если есть что-то особенное о StringContent
класса в отношении к Content-Length
заголовков, но это не имело никакого значения, независимо от того, если бы я использовал конструктор (который использует базовый класс HttpContent
) или общий метод FromContent
(с использованием фактического StringContent в этом случае), результат был таким же.
Так что мои вопросы:
Это предполагаемое поведение HttpContent.Headers
?
Есть ли некоторые заголовки, специфичные для фактического HttpContent
?
Что мне здесь не хватает?
Примечание: Это код для метода Flatten
расширения:
public static string Flatten(this HttpHeaders headers)
{
var data = headers.ToDictionary(h => h.Key, h => string.Join("; ", h.Value))
.Select(kvp => $"{kvp.Key}: {kvp.Value}");
return string.Join(Environment.NewLine, data)
}
Порядок элементов в ToDictionary не гарантируется, делает ли это тот же результат 'headers.ToDictionary (h => h.Key, h => string.Join ("; ", h.Value)) .Orderby (x => x.Key) .Выберите (kvp => $ "{kvp.Key}: {kvp.Value}") '? –
@AkashKava вопрос не о заказе. Проблема заключается в заголовках 'Content-Length', которые не всегда существуют. – Luiso
@ Luiso, можете ли вы показать [mcve], чтобы ваша проблема могла быть точно реплицирована. Это поможет найти решение вашей проблемы. – Nkosi