I HttpContent
in die folgenden dto bin Umwandlung:HttpContent Header inkonsistent Aufzählung
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
}
}
und leite einige Unit-Tests darauf:
[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);
}
Und das Test nicht besteht, da die Content-Length
Header nicht werden gefangen auf meinem dto. Aber wenn ich das tue:
[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);
}
Der Test vergeht und alle Header werden erfasst. Noch habe ich versucht, auch diese:
[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);
}
und es scheitert, da dto
hat nicht die Content-Length
Header, aber dto1
tut. Ich habe sogar versucht, die Header in einer Werk wie Methode wie folgt erhalten:
public static ContentDto FromContent<T>(T content) where T : HttpContent
{
// same as the constructor
}
zu sehen, ob es etwas Besonderes über die StringContent
Klasse in Bezug auf die Content-Length
Header war, aber es machte keinen Unterschied, egal ob ich verwendet den Konstruktor (der die Basisklasse HttpContent
verwendet) oder die generische Methode FromContent
(in diesem Fall den tatsächlichen StringContent), das Ergebnis war das gleiche.
Also meine Fragen sind:
Ist das das gewünschte Verhalten von HttpContent.Headers
?
Gibt es einige Header, die für den tatsächlichen HttpContent
Typ spezifisch sind?
Was fehlt mir hier?
Hinweis: Dies ist der Code für die Flatten
Erweiterungsmethode:
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)
}
Reihenfolge der Elemente in ToDictionary ist nicht garantiert, erzeugt dies das gleiche Ergebnis 'headers.ToDictionary (h => h.Key, h => string.Join ("; ", h.Value)) .Orderby (x => x.Key) .Wählen Sie (kvp => $ "{kvp.Key}: {kvp.Value}") '? –
@AkashKava das Problem ist nicht über die Reihenfolge. Das Problem sind die Header 'Content-Length', die nicht immer vorhanden sind. – Luiso
@Luiso, können Sie eine [mcve] zeigen, damit Ihr Problem genau repliziert werden kann. Dies hilft bei der Suche nach einer Lösung für Ihr Problem. – Nkosi