从Angular多次异步调用Web API会导致程序挂起

时间:2016-09-21 15:14:24

标签: angularjs asp.net-mvc asp.net-web-api

我必须从Angular多次调用Web API。问题是这导致线程中出现某种死锁,并且超时返回“任务被取消”。我尝试使用我在另一篇文章中找到的ConfigureAwait(false),但它没有解决我的问题。在我的角度控制器中,我有:

    function getClusterLinks(linkCode, returnString) {
    var deferred = $q.defer();
    $scope.returnString = returnString;
    contractorService.gethyperlink(linkCode)
    .success(function (data) {
        var vchUrl = data[0].vchUrl;
        var end = vchUrl.length;
        var docID = vchUrl.substring(vchUrl.indexOf("=") + 1, end);
        var vchLinkName = data[0].vchLinkName;
        var yay = '<a href="" ng-click="getDocumentByID(' + docID + ')">' + vchLinkName + '</a>';
        var yCode = "|Y" + linkCode + "~";
        $scope.returnString = $scope.returnString.replaceAll(yCode, yay);
        deferred.resolve();
    })
    return deferred.promise;

}

在我的角色服务中:

         this.gethyperlink = function (id) {
         return $http.get('/Home/GetHyperLink?id=' + id)
     };

在我的MVC控制器中:

        public async Task<ActionResult> GetHyperLink(int id)
    {
        var link = await CommonClient.GetHyperLinkByID(id);
        return Json(link, JsonRequestBehavior.AllowGet);
    }

在我的CommonWebApiClient中:

        public Task<List<HyperLinkModel>> GetHyperLinkByID(int linkID)
    {
        try 
        {

            var response = PerformGet<List<HyperLinkModel>>(string.Format("api/GetMyHyperlinks/{0}", linkID.ToString()));
            return response;
        }
        catch (Exception ex) 
        {
            throw ex;
        }
    }

在我的WebApiClientBase中:

 protected async Task<T> PerformGet<T>(string requestUri)
    {
        using (var client = new HttpClient { BaseAddress = _baseAddress })
        {
            try
            {
                AppendDefaultHeaders(client);
                var response = await client.GetAsync(requestUri).ConfigureAwait(false);
                var responseContent = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<T>(responseContent);
            }
            catch (Exception e)
            {
                throw e;
            }

        }
    }

它挂起的上面一行是:

var response = await client.GetAsync(requestUri).ConfigureAwait(false);

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我认为问题出在您的GetHyperLinkByID方法中。建议通过管道进行异步处理。试试这个

    public async Task<List<HyperLinkModel>> GetHyperLinkByID(int linkID)
{
    try 
    {

        var response = await PerformGet<List<HyperLinkModel>>(string.Format("api/GetMyHyperlinks/{0}", linkID.ToString()));
        return response;
    }
    catch (Exception ex) 
    {
        throw ex;
    }
}

当我在方法结束时使用异步方法添加Async时,它会帮助我,所以我知道我的方法是异步的,我需要等待它。

希望有所帮助。