WebApi无法返回HttpClient

时间:2016-11-27 17:14:54

标签: c# asp.net-mvc asp.net-web-api asp.net-web-api2 google-api-dotnet-client

当我试图从idx = pd.date_range(str(year), str(year + 1), freq='d', closed='left') (MVC应用程序)调用GetAllFiles()时,它会在结束大括号后卡住。我可以在调试模式下看到数据,但是当到达然后结束大括号时它会卡住。

当我从邮递员调用相同的WebApi方法时,我可以轻松获取数据。

HttpClient

这是HttpClient对api的调用

public class FileToDriveController : ApiController
{
    public IHttpActionResult GetAllFiles()
    {
        //Gets credentials 
        GoogleUtility googleUtility = new GoogleUtility();
        UserCredential credential = googleUtility.GetCredential();

        var service = new DriveService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "DriveApiFileUpload"
        });

        var listRequest = service.Files.List();
        listRequest.MaxResults = 10;

        IList<Google.Apis.Drive.v2.Data.File> files = listRequest.Execute().Items;

        if(files!=null)
        {
            return Ok(files); //i can see files here in debug mode
        }

        return InternalServerError();
    }
}

1 个答案:

答案 0 :(得分:1)

在控制器内进行异步调用时,问题是一个棘手的问题。请参阅此优秀说明:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

  

顶级方法调用GetJsonAsync(在UI / ASP.NET上下文中)。   GetJsonAsync通过调用HttpClient.GetStringAsync(仍在上下文中)启动REST请求。   GetStringAsync返回未完成的Task,表示REST请求未完成。   GetJsonAsync等待GetStringAsync返回的任务。捕获上下文,稍后将用于继续运行GetJsonAsync方法。 GetJsonAsync返回未完成的Task,表示GetJsonAsync方法未完成。   顶级方法同步阻止GetJsonAsync返回的任务。这会阻止上下文线程。   ...最终,REST请求将完成。这样就完成了GetStringAsync返回的任务。   GetJsonAsync的延续现在可以运行了,它等待上下文可用,以便它可以在上下文中执行。   僵局。顶级方法是阻塞上下文线程,等待GetJsonAsync完成,GetJsonAsync正在等待上下文空闲,以便它可以完成。

解决您的问题(再次,从博客文章中获取):

  

在“库”异步方法中,尽可能使用ConfigureAwait(false)。   不要阻止任务;一直使用async。