Я преобразую HttpContent
в следующее dto:
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
не записывается на моем dto. Однако, если я это сделаю:
[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
делает. Я даже пытался получить заголовки внутри Factory -подобного метода следующим образом:
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)
}