在MVC应用程序中使用httpclient

rag*_*che 5 c# asp.net-mvc dotnet-httpclient

当我在控制台应用程序中调用下面的函数时,它只是工作.但是当我将它添加到MVC控制器时,执行永远不会到达JsonConvert行.任何想法,我错过了什么.

调用代码

GetVersion(url).Result.FileVersion
Run Code Online (Sandbox Code Playgroud)

方法

public static async Task<Version> GetVersion(string url, string hostHeader)
{
    var client = new HttpClient();
    if (!string.IsNullOrEmpty(hostHeader))
    {
        client.DefaultRequestHeaders.Host = hostHeader;
    }
    var version = await client.GetStringAsync(url);
    var output = JsonConvert.DeserializeObject<Version>(version);
    client.Dispose();
    return output;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 8

正如我在博客上解释的那样,你正在造成僵局.默认情况下,await捕获"上下文"(在本例中为ASP.NET请求上下文)并使用它来恢复该async方法.ASP.NET请求上下文一次只允许一个线程,并且您通过调用阻止该线程Result,从而阻止该async方法完成.

您的控制台应用程序没有死锁,因为它没有"上下文",因此async方法在线程池上恢复.

解决方案是更改要使用的调用代码:

(await GetVersion(url)).FileVersion
Run Code Online (Sandbox Code Playgroud)