等待 HttpClient.GetStreamAsync 永远等待

时间:2021-02-15 13:01:44

标签: c# .net async-await dotnet-httpclient

问题是,当我将 await 放在 HttpClient.GetStreamAsync() 之前时,它不会返回任何内容,Visual Studio 只是挂起自己,只要我决定停止调试,就不会返回任何内容。当我尝试使用 .GetAwaiter().GetResult() 时,它会提示我在 this 问题上显示的错误,不幸的是没有产生任何解决方案。 这些错误导致了什么? TLS 问题不是肯定​​的。网络团队确保我试图从中获取结果的 api 的地雷请求没有被阻止,另一方确认他们也没有阻止我们的请求。这可以得到确认,因为 Postman 请求与 api 一起工作得很好。我使用了 HttpClientWebRequest,它们提示了同样的错误。等待甚至不会导致错误,它只是闲置...

为什么我会遇到这个问题?我怎样才能克服它?任何帮助表示赞赏。

(我尝试的代码和 solutions 可以在我的 this 问题中找到。

1 个答案:

答案 0 :(得分:1)

对您的问题的简短回答是“您的服务器没有返回所有数据,您确实要求该方法等待”。但这没有帮助。

您可能希望在 HttpClient get async 方法上超时。下面的代码是如何做到这一点的人为示例。下面是代码的作用:

  1. 创建了一个 CancellationToken 源,它将在 500 毫秒后通知 CancellationToken 已取消。
  2. 我获得了 Google 搜索页面的默认登录页面。我只使用 Geta 同步而不是 GetstreamAsync,因为我想不出我不必自己编码的流响应来源。虽然它是相同的主体。在我的网络上,500 毫秒的超时时间足够了,所以我收到一条消息“响应代码 = OK”。
  3. 如果我将 500 毫秒更改为 10 毫秒,响应不会在时间用完之前完成,并且我会收到“任务已取消”的消息。

所以,当你说“await”时,它的意思是“在这里等待直到我调用的方法完成,除非我在此之前取消等待。另外请记住,根据你的需要,可以有各种 CancellationTokenSources。这只是一个例子。

using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace cancel
{
    class Program
    {
        static async Task Main(string[] args)
        {
            CancellationTokenSource cancellationSource = new CancellationTokenSource(new TimeSpan(0,0,0,0,5000)); //Succeeds
            //CancellationTokenSource cancellationSource = new CancellationTokenSource(new TimeSpan(0,0,0,0,10)); //Fails
            CancellationToken cancellationToken = cancellationSource.Token;

            var client = new HttpClient();
            try
            {
                var result = await client.GetAsync("https://www.google.com",cancellationToken);
                Console.WriteLine($"Response code = {result.StatusCode}");
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

        }
    }
}