C# 在MVC应用程序中使用httpclient

C# 在MVC应用程序中使用httpclient,c#,asp.net-mvc,dotnet-httpclient,C#,Asp.net Mvc,Dotnet Httpclient,当我在控制台应用程序中调用下面的函数时,它就工作了。但当我将其添加到MVC控制器时,执行永远不会到达JsonConvert行。你知道我错过了什么吗 呼叫码 GetVersion(url).Result.FileVersion 方法 public static async Task<Version> GetVersion(string url, string hostHeader) { var client = new HttpClient(); if (!strin

当我在控制台应用程序中调用下面的函数时,它就工作了。但当我将其添加到MVC控制器时,执行永远不会到达JsonConvert行。你知道我错过了什么吗

呼叫码

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;
}
publicstaticasync任务GetVersion(字符串url,字符串hostHeader)
{
var client=新的HttpClient();
如果(!string.IsNullOrEmpty(hostHeader))
{
client.DefaultRequestHeaders.Host=hostHeader;
}
var version=await client.GetStringAsync(url);
var output=JsonConvert.DeserializeObject(版本);
client.Dispose();
返回输出;
}

正如我所说,您正在造成死锁。默认情况下,
await
捕获一个“上下文”(在本例中为ASP.NET请求上下文),并使用该上下文恢复
async
方法。ASP.NET请求上下文一次只允许一个线程进入,您通过调用
Result
阻塞该线程,从而阻止
async
方法完成

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

解决方案是将调用代码更改为使用:

(await GetVersion(url)).FileVersion

您使用的是哪个MVC版本?MVC4、.net4.5、VS2012谢谢,这很有效。我会详细阅读你的博客来了解更多