6

.net 4.5 でこの新しいテクノロジを少し試しています。この呼び出しのコードと、非同期呼び出しのエラーまたは応答をどのように制御する必要があるかを確認したいと思います。呼び出しは完全に機能しています。サービスから返される可能性のあるエラーを完全に制御する必要があります。

これは私のコードです:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;

namespace TwitterClientMVC.Controllers
{
    public class Tweets
    {
        public Tweet[] results;
    }

    public class Tweet
    {
        [JsonProperty("from_user")]
        public string UserName { get; set; }

        [JsonProperty("text")]
        public string TweetText { get; set; }
    }
}

public async Task<ActionResult> Index()
{                                             
    Tweets model = null;

    HttpClient client = new HttpClient();

    HttpResponseMessage response = await client.GetAsync("http://mywebapiservice");

    response.EnsureSuccessStatusCode();

    model = JsonConvert.DeserializeObject<Tweets>(response.Content.ReadAsStringAsync().Result);

    return View(model.results);            
}

これはそれを行うためのより良い方法ですか?または私は何かが欠けていますか?ありがとう

私はそれをリファクタリングしますが、このメソッドも非同期ですか?

public async Task<ActionResult> Index() 
    {
        Tweets model = null;
        using (HttpClient httpclient = new HttpClient())
        {
            model = JsonConvert.DeserializeObject<Tweets>(
                await httpclient.GetStringAsync("http://search.twitter.com/search.json?q=pluralsight")
            );
        }
        return View(model.results);
    }
4

1 に答える 1

7

これはそれを行うためのより良い方法ですか?

リモート サービスから返されたresponse.EnsureSuccessStatusCode();ステータス コードが 2xx と異なる場合、 は例外をスローします。したがってIsSuccessStatusCode、エラーを自分で処理したい場合は、代わりにプロパティを使用することをお勧めします。

public async Task<ActionResult> Index()
{                                             
    using (HttpClient client = new HttpClient())
    {
        var response = await client.GetAsync("http://mywebapiservice");

        string content = await response.Content.ReadAsStringAsync();
        if (response.IsSuccessStatusCode)
        {
            var model = JsonConvert.DeserializeObject<Tweets>(content);
            return View(model.results);            
        }

        // an error occurred => here you could log the content returned by the remote server
        return Content("An error occurred: " + content);
    }
}
于 2013-03-07T15:16:12.660 に答える