10

私は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がないため失敗しますが、ヘッダーはあります。次のように、 Factory のようなメソッド内でヘッダーを取得しようとしました。Content-Lengthdto1

 public static ContentDto FromContent<T>(T content) where T : HttpContent
 {
      // same as the constructor
 }

StringContentヘッダーに関するクラスに何か特別なものがあるかどうかを確認しますが、コンストラクター (基本クラスを使用) またはジェネリック メソッド(この場合は実際の StringContent を使用) を使用しても結果はContent-Length変わりませんでした。同じ。HttpContentFromContent

だから私の質問は:

それはの意図された動作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)
 }
4

2 に答える 2

0

HttpContent クラスは、ヘッダー プロパティに関してかなり奇妙な動作をしているようです。どういうわけか、ここに記載されているようにコンテンツの長さが計算されているようです。問題に具体的に対処するものではありませんが、最初のものと同様の新しい httpContent オブジェクトを使用してテストを行うことができます。問題なくコンテンツの長さを取得できると確信しています。

于 2016-07-28T08:05:15.883 に答える