2013-12-17 38 views
4

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

调用代码

GetVersion(url).Result.FileVersion 

方法

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; 
} 
+0

哪个版本的MVC您使用的是? – ckv

+0

MVC4,.net4.5,vs2012 – ragche

回答

8

您造成的僵局,因为我explain on my blog。默认情况下,await捕获一个“上下文”(在本例中为ASP.NET请求上下文),并使用该上下文恢复async方法。 ASP.NET请求上下文一次只允许一个线程,并且您通过调用Result来阻止该线程,从而阻止完成async方法。

您的控制台应用程序没有死锁,因为它没有“上下文”,所以async方法在线程池上恢复。

的解决办法是改变调用代码使用方法:

(await GetVersion(url)).FileVersion 
+0

谢谢,这个作品。我会详细阅读您的博客以了解更多 – ragche