HttpClient-大型上载的两个超时

HttpClient-大型上载的两个超时,http,upload,timeout,dotnet-httpclient,Http,Upload,Timeout,Dotnet Httpclient,我正在使用.net HttpClient,但这可能是关于HTTP的一个更一般的问题: 我想允许用户上传大文件,有时是缓慢和不可靠的移动连接。 如果上传没有在20秒内启动,那么可能是连接问题,因此应用程序应该采取适当的措施(例如现在放弃,稍后再试) 但如果上传开始,可能需要几分钟才能完成。在这种情况下,我不希望超时来中断它。然后,我只想放弃,并抛出一个错误,如果上传进度速度减慢到爬行 因此,我似乎需要两个超时条件—初始连接需要20秒超时,上传完成需要10分钟(最好是动态计算的)超时 有办法做到这一

我正在使用.net HttpClient,但这可能是关于HTTP的一个更一般的问题: 我想允许用户上传大文件,有时是缓慢和不可靠的移动连接。 如果上传没有在20秒内启动,那么可能是连接问题,因此应用程序应该采取适当的措施(例如现在放弃,稍后再试) 但如果上传开始,可能需要几分钟才能完成。在这种情况下,我不希望超时来中断它。然后,我只想放弃,并抛出一个错误,如果上传进度速度减慢到爬行

因此,我似乎需要两个超时条件—初始连接需要20秒超时,上传完成需要10分钟(最好是动态计算的)超时

有办法做到这一点吗?Timeout似乎对整个上传设置了限制,而不仅仅是初始连接

我使用的是HttpClient.PutAsync(),我通过重写HttpContent.SerializeToStreamAsync()来监视进度。如果有必要,我可以在这个函数中包含一个最小速度检查,如果进度太慢,就终止


干杯。

HttpClient上的超时对您没有任何用处。就我所知,没有办法区分连接时间段和发送请求正文

最好的选择是按照您的建议创建自己的派生HttpContent,或者使用PushStreamContent。这将允许您监视发送进度


假设您的服务器不返回连接:close您可以用一个HEAD请求点击服务器以打开TCP连接,然后您的第二个请求可以是PUT,它将重新使用TCP连接。至少这样你知道服务器是可用的。

但是,由于一些未知的原因,PutAsync重载没有一个采用HttpCompletionOption。这是否意味着我需要改用SendAsync?我该怎么做?我找不到使用HttpClient方法的示例。因此,在上面的代码中,如何使用响应变量来执行实际的上载?(附有进度报告)。我在WebRequest或HttpClient.PutAsync中使用的方法在这种情况下似乎不适用。@thund我添加了一个更新,希望这足够详细,可以让您继续。但是response.Content是HttpContent,它没有GetStreamAsync()。它有一个ReadAsStreamAsync(),但是它提供了一个不可写的流,所以我不能用它来上传任何东西。@thund哦,很抱歉混淆了这个问题。我完全没有理解你关于上传大文件的观点。我会更新我的答案。