异步功能未完成,但我没有收到任何错误消息

时间:2017-03-30 12:53:29

标签: c# http asynchronous async-await

背景

目前正在创建一个web api,需要与我创建的另一个web api交谈。这个有问题的web api是开箱即用的,我唯一感到生气的是启用内核并为其添加了两个类。

问题

目前这个web api正在一直执行到我的集成点,但当它点击HttpResponseMessage hrm = await hc.GetAsync(requestUrl);时它会停止并且不会给我一个错误。我尝试对该函数进行try catch但是它忽略了try catch以及。以下代码将说明我如何构建此Web api。

代码

控制器

    [Route("api/WorkingPaperServices/CreateWorkingPaper")]
    public IHttpActionResult CreateWorkingPaper()
    {
        try
        {
            log4net.Config.XmlConfigurator.Configure();
            bool complete = WorkingPaperCreator.StartWPCreation().Result; 
            return Ok("Finished");
        }
        catch(Exception ex)
        {
            log4net.LogManager.GetLogger("EmailLogger").Error(JsonConvert.SerializeObject(ex));
            return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Not Laoded"));
        }              
    }

WorkingPaperCreator - 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;

namespace CWAppServices.Services
{
    public class WorkingPaperCreator
    {
        public static async Task<bool> StartWPCreation()
        {
            try
            {
                var testing = await IntergrationPoints.GetClientInformation();
                return true;
            }
            catch(Exception ex)
            {
                return false;
            }
        } 
    }
}

IntergrationPoints - 类(我的问题所在)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;

namespace CWAppServices.Services
{
    public class IntergrationPoints
    {
        public static async Task<bool> GetClientInformation()
        {
            List<string> uniqueID = new List<string>();
            try
            {              
                string requestUrl = "http://appdev.tenant.com/caseware32/api/DataServices/GetAllClients";

                var action = new HttpMethod("GET");

                HttpClient hc = new HttpClient();

                HttpResponseMessage hrm = await hc.GetAsync(requestUrl);

                if (hrm.IsSuccessStatusCode)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                // TODO Log 
                return false;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

此阻止通话会导致问题: bool complete = WorkingPaperCreator.StartWPCreation().Result;。 你得到了死锁。为避免它使用aync \ await无处不在(使控制器同步)或将.ConfigureAwait(false)添加到所有等待调用。