当 MVC 客户端时执行挂起,但当客户端是控制台应用或测试项目时,执行工作

本文关键字:执行 客户端 测试 工作 应用 项目 MVC 挂起 控制台 | 更新日期: 2023-09-27 18:34:26

我有一个MVC5项目,该项目正在使用类库项目中的服务和存储库。当我将以下代码作为 MVC 项目运行/调试时,执行挂起在"返回等待客户端。GetAsync(url);" 在存储库中。不会引发任何异常。

如果我从单元测试或控制台应用程序调用相同的服务代码和存储库代码,则代码工作正常。

代码出了什么问题,或者我做错了什么?

文件:测试控制器.cs

public ActionResult Index(string q)
{
    //Code
    var mySvc = new MyService();
    var svcResponse = mySvc.GetAsync(q).Result;
    //More code
}

文件:我的服务.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);
}

文件:我的存储库.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!
    }
}

当 MVC 客户端时执行挂起,但当客户端是控制台应用或测试项目时,执行工作

您应该使控制器方法异步,而不是阻止 。结果(导致死锁)。您的控制器操作应如下所示

   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