控制器操作中的异步web响应

时间:2014-06-13 13:30:51

标签: c# asp.net-mvc wcf asynchronous

我有一个MVC控制器。在该控制器中,我引用了一个WCF服务,该服务访问第三方请求(通过webrequest),该请求返回信息,然后保存在WCf服务中(非常具体地,我们收集有关访问的数据并将它们保存到数据库中以便我们可以更好地定位我们的页面组织。)

TL; DR是这样的:

 private ActionResult CollectTrackingData(string campaign = "none")
    {
        VanityURLService.VanityURLConnector connector = new VanityURLService.VanityURLConnector();
        connector.SaveTrackingData(Request, campaign); 
        return View(someVarView);
    }

SaveTrackingData在调用此方法之前会做很多事情(编辑以保护不那么无辜):

 private string TranslateGeolocation(string ipAddress)
    {
        WebRequest pageRequest = System.Net.WebRequest.Create("http://blahblah.com");
        WebResponse resp = pageRequest.GetResponse();

        System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
        string reqResp = sr.ReadToEnd().Trim();
        return reqResp.ToString();
    }

可能导致问题的部分是WebResponse resp = pageRequest.GetResponse();,但我不禁想到最好的方法是将整个过程级联的调用异步(这将是控制器代码) :connector.SaveTrackingData(Request, campaign);

但是当我尝试将调用异步时,它会向我抱怨一些事情,直到经过多次调整后,它要求我让它返回一个返回类型然后仍然不起作用因为我认为不能在页面生命周期的那个阶段使它异步(然后它提供了aspx代码,因为我使用Razor引擎运行它是无用的。)

这一切似乎都比它需要的更困难。我觉得我应该能够CollectTrackingData()调用异步,但它不喜欢这样。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

只需更改操作方法即可返回Task<ActionResult>

一切都会好起来的。

答案 1 :(得分:0)

要将方法转换为异步,正确的方法签名是:

private Task<string> TranslateGeolocation(string ipAddress)

然后调用它:

string str = await TranslateGeolocation(ipAddress);

await关键字将为您string打开Task<>

如果您想要转换通常不会返回值的方法,即

private void DoSomething()

异步签名将是:

private Task DoSomething()