【问题标题】:Call asynchronous external web service in asp.net MVC controller在 asp.net MVC 控制器中调用异步外部 Web 服务
【发布时间】:2014-03-20 15:34:05
【问题描述】:

在 Asp.net MVC 控制器(GET 方法)中,我正在调用外部 Web 服务 - 用于 IP 的地理位置 - 返回 IP 位置的 json 数据。如何使调用异步,因此堆栈可以在等待服务响应时继续。 GEO IP 请求完成后,我希望能够对数据库进行更新。这是当前的同步代码:

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

任何建议 - 线程,AsyncTask ? 谢谢

【问题讨论】:

  • WebRequest.GetResponseAsync?

标签: c# model-view-controller asynchronous external webrequest


【解决方案1】:

使您的 ASP.NET MVC 控制器异步:

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

然后使用HttpClient.GetStringAsyncawait 其结果:

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

【讨论】:

  • 感谢 Noseratio。这个线程安全吗?!我希望能够在响应后将服务中的数据插入数据库。堆栈是否会在等待响应时继续(显示视图)然后执行异步任务。那么如何调用数据库呢?
  • @DarkoSimonovski,它和其中使用的对象一样是线程安全的。这里,HttpClient 的单个实例不会被多个线程同时使用,因此它线程安全的。但是,在 ASP.NET 中,after 之后可能会发生线程切换。此外,这取决于您要使用的特定 DB API。我建议您阅读此处列出的文章:stackoverflow.com/tags/async-await/info
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 2023-03-26
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
相关资源
最近更新 更多