C# 在MVC应用程序中使用httpclient
当我在控制台应用程序中调用下面的函数时,它就工作了。但当我将其添加到MVC控制器时,执行永远不会到达JsonConvert行。你知道我错过了什么吗 呼叫码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
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谢谢,这很有效。我会详细阅读你的博客来了解更多