C# 在HttpClient上等待。GetStreamAsync将永远等待

C# 在HttpClient上等待。GetStreamAsync将永远等待,c#,.net,async-await,dotnet-httpclient,C#,.net,Async Await,Dotnet Httpclient,问题是,当我将wait放在HttpClient.GetStreamAsync()之前时,它不会返回任何内容,Visual Studio只是挂起自己,只要我决定停止调试,就不会返回任何内容。当我尝试使用.GetAwaiter().GetResult()时,它会提示我在问题上显示的错误,不幸的是,该错误没有产生任何解决方案。 这些错误的结果是什么?TLS问题不是很确定。网络团队确保没有阻止我试图获取结果的api请求,另一方确认他们也没有阻止我们的请求。这是可以确认的,因为邮递员请求与api配合得很好

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

为什么我会有这个问题?我怎样才能克服它?感谢您的帮助


(我尝试过的代码和
解决方案可以在我的问题中找到。

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

您可能希望在HttpClient get async方法上设置一个超时。下面的代码是一个人为的示例,说明了如何执行此操作。下面是代码的操作:

  • 将创建一个CancellationToken源,该源将在500毫秒后向CancellationToken发送取消信号
  • 我得到了Google搜索页面的默认登录页。我只使用了Geta sync而不是GetstreamAsync,因为我想不出一个流响应的源,我不需要自己编写代码。但这是相同的原理。在我的网络上,500毫秒的超时时间足够了,所以我得到了一个消息“响应代码=正常”的e
  • 如果我将500毫秒更改为10毫秒,则响应不会在时间用完之前完成,并且我会收到一条消息“任务已取消”
  • 所以,当你说“wait”时,它实际上是指“在这里等待,直到我调用的方法完成,除非我在此之前取消wait。还要记住,根据你的需要,可以有各种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);
                }
    
            }
        }
    }
    

    所有错误都表明服务器存在问题。您无法在客户端解决此问题。您只能为操作添加一个超时,这样您就不会永远等待。顺便说一句,阻止异步操作是一个坏主意。通过允许过时操作来削弱TLS加密也是一个坏主意algorithms@PanagiotisKanavos,我创建了一个.Net Framework 4.7.2项目aNDA是一个工作正常的.Net Core 3.1项目。一点也不麻烦。但是一个在.Net Framework 4.7.2上工作的项目,在某种程度上不能像预期的那样工作。这个问题不可能是服务器问题。创建一个新的HttpClient实例也很糟糕,这个类是线程安全的,可以重用。否则,你最终会耗尽所有可用的套接字,而这些套接字都是c导致问题的原因。请检查。您没有提供足够的信息,因此人们只能猜测出问题所在。特别是在这个问题中。HttpClient没有损坏。如果有流,
    GetStreamAsync
    将打开它。因此,要么服务器被阻塞,要么客户端代码以某种方式自行阻塞。HttpClient没有损坏。您发布的代码但是,原始问题中的ed存在严重的错误-阻止异步调用、削弱安全性、创建新的HttpClient实例以及可能耗尽可用的sockets。假设
    Postman
    可以使用您的公司代理设置,而.Net应用程序可能试图直接建立代理设置。看起来您的环境有问题t、 而是代码。感谢您建议限制等待时间。这肯定会对我有很大帮助。您是否知道.Net Framework 4.7.2 Web API项目如何无法使用
    HttpClient
    获取内容,但在使用相同网络的同一台机器上,.Net Core 3.1控制台应用程序获取same query很好?另外,一个常规的.Net Framework 4.7.2控制台应用程序也很好,就像.Net Core 3.1.Can
    ApicController
    一样,它是在
    Web API
    项目上继承的,导致了这个问题?我需要更多的信息,但我可以告诉你.Net Framework HttpClient和.Net Core Http的工作方式几乎没有什么区别客户端工作。如果我不得不猜测,我会说4.7.2代码中有一个bug。我会和网络团队谈谈,看看网络是否会导致任何错误。他们说他们已经修复了它,因为我使用其他项目/工具从同一个查询中得到了正常结果,他们只是说这与网络无关:/我希望他们错了,因为我没有有任何关于代码可能存在bug的信息。感谢您的帮助:)