rgx71
rgx71

Reputation: 857

async calls using HttpClient on MVC4

I'm playing a little bit with this new technology in .net 4.5, I would like to check the code for this call and how should I control the errors or the response of my async call. The call is working perfectly, I need full control of possible errors returned from my service.

this is my code:

    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);            
}

Is this the better way to do it? or I'm missing something? Thanks

I refactor it, is this method async as well?

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);
    }

Upvotes: 6

Views: 11899

Answers (1)

Darin Dimitrov
Darin Dimitrov

Reputation: 1038780

Is this the better way to do it?

The response.EnsureSuccessStatusCode(); will throw an exception if the status code returned by your remote service is different than 2xx. So you might want to use the IsSuccessStatusCode property instead if you want to handle the error yourself:

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);
    }
}

Upvotes: 7

Related Questions