14

アクションの1つで、私はこのようなことをします

public HttpResponseMessage Post([FromBody] Foo foo)
{
    .....
    .....

    var response = 
          Request.CreateResponse(HttpStatusCode.Accepted, new { Token = "SOME_STRING_TOKEN"});
    return response;
}

そのような多くのメソッドは匿名型のインスタンスを返し、うまく機能します。

今、私はそのためのテストを書いています。私は持っている

HttpResponseMessage response = _myController.Post(dummyFoo);

HttpResponseMessageと呼ばれるプロパティがContentあり、 がありReadAsAsync<T>()ます。

具体的な特定のタイプがあった場合、私はできることを知っています

Bar bar = response.Content.ReadAsAsync<Bar>();

しかし、返された匿名型にアクセスするにはどうすればよいでしょうか? 出来ますか?

私は次のことを望んでいました:

dynamic responseContent = response.Content.ReadAsAsync<object>();
string returnedToken = responseContent.Token;

しかし、タイプオブジェクトのインスタンスにプロパティトークンがないというエラーが発生しました。これは、デバッガーが 1 つのプロパティ Token を持つ responseContent を示している場合でも発生します。その理由は理解していますが、プロパティにアクセスする方法があるかどうか知りたいです。

ここに画像の説明を入力

ありがとう

4

2 に答える 2

16

.ReadAsAsync<T>は非同期メソッドです。つまり、逆シリアル化されたオブジェクト全体を返すのではなく、Task<T>非同期タスク全体の継続を処理します。

次の 2 つのオプションがあります。

1. 非同期パターン。

async囲んでいるメソッドでキーワードを使用し(例: public async void A())、非同期呼び出しを次のように行います。

dynamic responseContent = await response.Content.ReadAsAsync<object>();
string returnedToken = responseContent.Token;

2.定期タスクAPI

または、タスク API を使用します。

response.Content.ReadAsAsync<object>().ContinueWith(task => {
   // The Task.Result property holds the whole deserialized object
   string returnedToken = ((dynamic)task.Result).Token;
});

それはあなた次第です!

アップデート

task.Waitスクリーンショット全体を投稿する前は、非同期の結果を待つために電話をかけていることを誰も知りませんでした。しかし、それはさらなる訪問者を助けるかもしれないので、私は私の答えを維持するつもりです:)

私自身の回答へのコメントで提案したように、にデシリアライズしてみてくださいExpandoObject。ASP.NET WebAPI は、基になる JSON シリアライザーとして JSON.NET を使用します。つまり、expando オブジェクトへの匿名 JavaScript オブジェクトの逆シリアル化を処理できます。

于 2013-02-05T15:49:15.553 に答える