2017-07-04 4 views
0

このAPIをasync awaitスタイルを使用して呼び出しようとしましたが、いくつか問題があります。私は私のアプリのコンソールで上記のメソッドを呼び出していますasync awaitパターンを使用してAPIからJSON結果を返そうとしています

public async Task<User> GetUser(int userId) 
{ 
    User user = null; 
    HttpResponseMessage response = await client.GetAsync("/user/..."); 
    if(response.IsSuccessStatusCode) 
    { 
     var result = await response.Content.ReadAsStringAsync(); 
     user = JsonConvert.DeserializeObject<User>(result); 
    } 

    return user; 
} 

var user = apiClient.GetUser(123); 

Console.WriteLine($"user result is {user.Result.UserId}"); 

私はエラーを取得する:

An unhandled exception of type 'System.NullReferenceException Object reference not set to an instance..

は、ベストプラクティス、次の私のコードスニペットです何か問題はありますか?

Postmanを使用してテストすると、エンドポイントが正常に動作します。

更新

私GetUserメソッドのためのインタフェースは次のとおりです。

Task<User> GetUser(int userId); 
+0

であるかを把握するのは難しいのですか?それはどの変数がnullであるかを理解するのに役立ちます – KernelMode

+0

これは私のConsole.WriteLine行にあります... –

+0

@VladStryapko私は自分のインタフェースシグネチャも追加しました。私はその行に待つ必要があります。 await演算子は非同期メソッドでしか使用できません.... '' ' –

答えて

0

Iやった後、私は、エラーを得ていたと私は値を取得するとき、私はまた、結果応答を取得.Content.ReadAsStringAsync()。Result;がありますが、デバッグして実際にjson値を取得していることを確認する必要があります。

string responseString = ""; 
    ... 
     if (response.IsSuccessStatusCode) 
     { 
     responseString = response.Content.ReadAsStringAsync().Result; 
     Message jsonObject = JsonConvert.DeserializeObject<Message>(responseString.ToString(), 
    new JsonSerializerSettings 
    { 
    NullValueHandling = NullValueHandling.Ignore 
    }); 

     ... 
}  
-1

オブジェクトを常に初期化することをお勧めします。

User user = new User(); // Ensuring it will return a empty object instead of null. 

実際の完全なコードを見ずにヌル例外が発生したフルスタックトレースを追加することができ、インサイダーGetAsync(...)は

+0

これは確かに例外を取り除きますが、これは実際の問題に対して実際には有用な解決策ではありません。遅かれ早かれ、既定のユーザーオブジェクトを使用すると、再びあなたを噛ませるでしょう。あなたは問題をさらに遅らせるだけです。そして、そのユーザーが見つからない場合に、ユーザーを見つけるはずのAPIが実際に空のユーザーオブジェクトを返すべきかどうかは議論の余地があります。 – poke

関連する問題