背景
目前正在创建一个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;
}
}
}
}
答案 0 :(得分:3)
此阻止通话会导致问题:
bool complete = WorkingPaperCreator.StartWPCreation().Result;
。
你得到了死锁。为避免它使用aync \ await无处不在(使控制器同步)或将.ConfigureAwait(false)
添加到所有等待调用。