在 MVC 应用程序中使用 httpclient [重复]

Posted

技术标签:

【中文标题】在 MVC 应用程序中使用 httpclient [重复]【英文标题】:Using httpclient in MVC application [duplicate] 【发布时间】:2013-12-17 05:24:57 【问题描述】:

当我在控制台应用程序中调用以下函数时,它可以正常工作。但是当我将它添加到 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;

【问题讨论】:

你使用的是哪个 MVC 版本? MVC4、.net4.5、vs2012 【参考方案1】:

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

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

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

(await GetVersion(url)).FileVersion

【讨论】:

谢谢,这行得通。我会详细阅读您的博客以了解更多信息

以上是关于在 MVC 应用程序中使用 httpclient [重复]的主要内容,如果未能解决你的问题,请参考以下文章

控制台应用程序 HttpClient 发布到 mvc web api

MVC4 中使用城堡温莎的 HttpClient 的生活方式

ASP.NET MVC 4 HttpClient() 问题

如何在使用 HttpClient 使用 Asp Net Web Api 的 Asp Net Mvc 中提供实时数据?

如何使用 .Net 4.0 中包含的 HttpClient 类将文件上传到在 IIS Express 中运行的 Asp.Net MVC 4.0 操作

处理注入的 HttpClient