我有一个 MVC5 项目,它使用类库项目中的服务和存储库。当我将以下代码作为 MVC 项目运行/调试时,执行卡在“return await client.GetAsync(url);”处在存储库中。不抛出异常。
如果我从单元测试或控制台应用程序调用相同的服务代码和存储库代码,那么代码可以正常工作。
代码有什么问题或我做错了什么?
//文件:TestController.cs
public ActionResult Index(string q)
{
//Code
var mySvc = new MyService();
var svcResponse = mySvc.GetAsync(q).Result;
//More code
}
//文件:MyService.cs
public async Task<MyResponse> GetAsync(string q)
{
var myRepo = new MyRepository();
var response = await myRepo.GetAsync(q);
var json = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<MyResponse>(json);
}
//文件:MyRepository.cs
public async Task<HttpResponseMessage> GetAsync(string q)
{
var url = URL_CONSTANT + q;
using (var client = new HttpClient())
{
return await client.GetAsync(url); //Execution hangs here when MVC!
}
}
最佳答案
您应该使您的 Controller 方法异步,而不是在 .Result 上阻塞(这会导致死锁)。你的 Controller Action 应该是这样的
public async Task<IActionResult> Index(string q)
{
//Code
var mySvc = new MyService();
var svcResponse = await mySvc.GetAsync(q);
//More code
}
有关更多详细信息,请参见此处的示例 http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
关于c# - 当 MVC 客户端时执行挂起,但当客户端是控制台应用程序或测试项目时执行正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35353385/