[英]Async webresponse in controller action
我有一个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()
异步调用,但事实并非如此。
有人可以指出我正确的方向吗?
只需更改您的操作方法即可返回Task<ActionResult>
。
然后一切都会正常。
要将您的方法转换为异步方法,正确的方法签名为:
private Task<string> TranslateGeolocation(string ipAddress)
然后调用它:
string str = await TranslateGeolocation(ipAddress);
await
关键字将为您解开Task<>
的string
。
如果要转换通常不会返回值的方法,即
private void DoSomething()
异步签名将是:
private Task DoSomething()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.