异步方法不返回asp.net mvc 4

本文关键字:mvc net asp 返回 异步方法 | 更新日期: 2023-09-27 18:09:18

我有一个异步方法的问题,我实现。该方法基本上是对资源进行HttpRequest,如果请求成功,则对字符串进行反序列化。我为这个方法写了一个测试,它可以工作。但是当我从控制器调用它时,方法永远不会返回?

    public async Task<IEnumerable<T>> Get()
    {
        try
        {
            var resourceSegmentUri = new Uri(_uri, UriKind.Relative);
            var response = await _client.GetAsync(resourceSegmentUri);
            if (response.IsSuccessStatusCode)
            {
                var submission = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<IEnumerable<T>>(submission);
            }
            if (response.Content != null)
            {
                var message = response.Content.ReadAsStringAsync();
                throw new WebException(message.Result, (WebExceptionStatus)response.StatusCode);
            }
        }
        catch (WebException e)
        {
            Logger.Error("GET Request failed with status: {0}", e.Status);
            throw;
        }
        throw new Exception();
    }

永远不返回的代码:

public ActionResult Index()
{
   var api = new Api();
   var test = api.Get().Result; //Never returns
   return View();
}

有效的测试:

[Test]
public void GetShouldReturnIfSuccessfulRequest()
{
    var api = new Api();
    var submission = api.Get();
    Console.WriteLine(JsonConvert.SerializeObject(submission));
    Assert.NotNull(submission);
}

有谁知道这个问题吗?

异步方法不返回asp.net mvc 4

你遇到了死锁,因为你在控制器操作中调用了.Result

如果你使用async/await,那么你也必须使用异步操作。

所以像这样的东西应该修复它:

public async Task<ActionResult> Index()
{
  var api = new Api();
  var test = await api.Get(); // Should return
}

在这里有一篇全面的文章:在ASP中使用异步方法。. NET MVC 4