【问题标题】:Async webresponse in controller action控制器动作中的异步网络响应
【发布时间】:2014-08-04 02:04:09
【问题描述】:

我有一个 MVC 控制器。在那个控制器中,我引用了一个访问第 3 方请求(通过 webrequest)的 WCF 服务,该服务返回信息,然后保存在 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();,但我不禁想到最好的方法是使级联整个过程异步的调用(这将是控制器代码:@ 987654324@

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

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

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

【问题讨论】:

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


    【解决方案1】:

    只需更改您的操作方法以返回Task<ActionResult>

    然后一切都会正常工作。

    【讨论】:

    • 无法将类型 'System.Web.Mvc.ActionResult' 隐式转换为 'System.Threading.Tasks.Task' 抱歉,我没有使用 Task 和async before 所以我不确定解决方法是什么。
    • @MetalPhoenix:你还需要async
    • It.... 我在 Task 操作中调用的操作或方法?
    • 所有调用异步方法的东西。
    【解决方案2】:

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

    private Task<string> TranslateGeolocation(string ipAddress)
    

    然后调用它:

    string str = await TranslateGeolocation(ipAddress);
    

    await 关键字将为您从Task&lt;&gt; 解开string

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

    private void DoSomething()
    

    异步签名是:

    private Task DoSomething()
    

    【讨论】:

    • string geoResp = await TranslateGeolocation("70.60.249.115");返回错误:无法等待字符串。但是,问题在于数据库保存命令紧跟在 TranslateGeolocation 命令之后,所以我想它会在返回结果之前尝试保存。因此,对 (SaveTrackingData()) 的调用不应该被称为异步吗?因此,试图从控制器中调用它的原始问题......
    • 你说你试图让它异步,它抱怨,你调整了一些东西,但后来卡住了。你能用异步代码更新你的问题吗?这将帮助我从那里诊断问题。
    猜你喜欢
    • 2013-06-10
    • 2017-12-26
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2016-01-14
    相关资源
    最近更新 更多