【发布时间】:2016-11-28 00:18:22
【问题描述】:
我正在将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-like 方法中获取标题,如下所示:
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).Select(kvp => $"{kvp.Key}: {kvp.Value}")? -
@AkashKava 问题与订单无关。问题是
Content-Length标头并不总是存在。 -
@Luiso,您能否显示minimal reproducible example,以便可以准确地复制您的问题。这将有助于为您的问题找到解决方案。
标签: c# http-headers dotnet-httpclient httpcontent