Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call asynchronous external web service in asp.net MVC controller

In the Asp.net MVC controller (GET method) I am calling external web service - for geolocation of IP - returning json data for IP location. How can I make the call to be async, hence the stack can continue while waiting the response from the service. When the GEO IP request finished I want to be able to make update to the db. Here is the current sync code:

public ActionResult SelectFacility(int franchiseId, Guid? coachLoggingTimeStampId)
{
    //...
    string responseFromServer = Helpers.GetLocationByIPAddress(userIpAddress);

    HomeModels.GeoLocationModel myojb = new HomeModels.GeoLocationModel();

    if (!String.IsNullOrEmpty(responseFromServer))
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        myojb = (HomeModels.GeoLocationModel)js.Deserialize(responseFromServer, typeof(HomeModels.GeoLocationModel));

    }
    //...
}
public static string GetLocationByIPAddress(string ipAddress)
{
    Stream resStream = null;
    string responseFromServer = "";
    try
    {
        string url = GeoLocationPath.FreeGeoIP + ipAddress;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        resStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(resStream);
        responseFromServer = reader.ReadToEnd();
        return responseFromServer;
    }
    catch (Exception ex)
    {
        //TODO handle this
    }
    finally
    {
        if (null != resStream)
        {
            resStream.Flush();
            resStream.Close();
        }
    }
    return responseFromServer;
}

Any suggestion - Thread, AsyncTask ? Thanks

like image 849
Darko Simonovski Avatar asked Nov 01 '22 03:11

Darko Simonovski


1 Answers

Make your ASP.NET MVC controller asynchronous:

http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4

Then use HttpClient.GetStringAsync and await its result:

public async Task<ActionResult> SelectFacility(
    int franchiseId, Guid? coachLoggingTimeStampId)
{
    //...
    string responseFromServer = await Helpers.GetLocationByIPAddressAsync(
        userIpAddress);
    //...
}

public static async Task<string> GetLocationByIPAddress(string ipAddress)
{
    using (var httpClient = new HttpClient())
        return await httpClient.GetStringAsync(
            GeoLocationPath.FreeGeoIP + ipAddress);
}
like image 82
noseratio Avatar answered Nov 12 '22 22:11

noseratio