我正在转换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
有。我什至尝试在类似工厂的方法中获取标题,如下所示:
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)
}