gpt4 book ai didi

c# - HttpClient 似乎忽略了 Timeout 属性

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:07 25 4
gpt4 key购买 nike

我试图通过在响应中返回 MultiPartContent 从服务器加载大量数据。但是,在 HttpGet 方法期间,我设置的超时值被忽略了。我正在尝试设置更长的超时时间,因为在这种情况下等待是可以的。

我尝试了 10 分钟到 2 小时之间的各种超时值。实际上,用户在第一次使用我们的应用程序时只需等待约 5 分钟,其他时间会更少。我还尝试存储 HttpClient 的引用以确保 api.HttpClient 不会每次都重新创建 HttpClient 对象。

var handler = new HttpClientHandler();
var progress = new ProgressMessageHandler(handler);
var api = APIHelpers.GetSession(progress);

progress.HttpReceiveProgress += (e, args) => ProgressChanged.Invoke(e, new SyncEventArgs(GlobalEnums.SyncStage.Downloading, args.ProgressPercentage * 0.01f));

api.HttpClient.Timeout = new TimeSpan(0, 10, 0);

var downloadUri = BuildURI();
var response = await api.HttpClient.GetAsync(downloadUri, HttpCompletionOption.ResponseHeadersRead);

我希望应用程序在抛出超时异常之前等待 10 分钟,但是异常在 100 秒后抛出(我相信这是默认值?)。检查设置后的 HttpClient.Timeout 值确实表明它设置正确。

APIHelpers.GetSession() 方法返回我们 API 的一个对象,其中创建了授权 header 。 HttpClient 对象可通过继承的类访问。这是由 Swashbuckle 和 Swagger 创建的。我之前以这种方式使用过 api.HttpClient.Timeout = x 并取得了成功,所以我认为这不是问题所在。好像特别针对这个场景。

抛出的异常:

{System.Net.Http.HttpRequestException: An error occurred while sending the request ---> System.Net.WebException: The operation has timed out.
at System.Net.HttpWebRequest.RunWithTimeoutWorker[T] (System.Threading.Tasks.Task`1[TResult] workerTask, System.Int32 timeout, System.Action abort, System.Func`1[TResult] aborted, System.Threading.CancellationTokenSource cts) [0x000f8] in <a1ab7fc4639d4d84af41d68234158b1c>:0
at System.Net.HttpWebRequest.EndGetResponse (System.IAsyncResult asyncResult) [0x00019] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.14.0.114/src/Xamarin.iOS/mcs/class/System/System.Net/HttpWebRequest.cs:1200
at System.Threading.Tasks.TaskFactory`1[TResult].FromAsyncCoreLogic (System.IAsyncResult iar, System.Func`2[T,TResult] endFunction, System.Action`1[T] endAction, System.Threading.Tasks.Task`1[TResult] promise, System.Boolean requiresSynchronization) [0x0000f] in <939d99b14d934342858948926287beba>:0
--- End of stack trace from previous location where exception was thrown ---

at System.Net.Http.MonoWebRequestHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x003d1] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.14.0.114/src/Xamarin.iOS/mcs/class/System.Net.Http/MonoWebRequestHandler.cs:499
--- End of inner exception stack trace ---
at System.Net.Http.MonoWebRequestHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x0046a] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.14.0.114/src/Xamarin.iOS/mcs/class/System.Net.Http/MonoWebRequestHandler.cs:503
at Microsoft.Rest.RetryDelegatingHandler+<>c__DisplayClass11_0.<SendAsync>b__1 () [0x000ad] in <6a6c837cafbb4f1faffaba1ff30ca4e3>:0
at Microsoft.Rest.RetryDelegatingHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x00150] in <6a6c837cafbb4f1faffaba1ff30ca4e3>:0
at System.Net.Http.Handlers.ProgressMessageHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x00087] in <19af20e76ce04547b3fc150a0f8f2d47>:0
at System.Net.Http.HttpClient.SendAsyncWorker (System.Net.Http.HttpRequestMessage request, System.Net.Http.HttpCompletionOption completionOption, System.Threading.CancellationToken cancellationToken) [0x0009e] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.14.0.114/src/Xamarin.iOS/mcs/class/System.Net.Http/System.Net.Http/HttpClient.cs:281
at ...

编辑:我只是添加了一些我尝试过的其他东西来解决这个问题。

  1. 我尝试使用 Xamarin.Forms 中的 DependencyService 为每个平台获取 native HttpClientHandlersHttpClient 对象,我可以在其中设置每个平台的超时,而不是依赖 Xamarin.Forms 为我翻译它。这产生了完全相同的结果。
public HttpMessageHandler GetHttpHandler(double timeoutSeconds)
{
var sessionConfig = NSUrlSessionConfiguration.DefaultSessionConfiguration;
sessionConfig.TimeoutIntervalForRequest = timeoutSeconds;
sessionConfig.TimeoutIntervalForResource = timeoutSeconds;
sessionConfig.WaitsForConnectivity = true;

var sessionHandler = new NSUrlSessionHandler(sessionConfig);
return sessionHandler;
}
  1. 我已经尝试为这个 API 调用创建一个新的 HttpClient 对象,但也没有成功。 (这取代了我代码中的 Apihelpers.GetSession())

最佳答案

有一个known issue in both Xamarin.iOS and Xamarin.Android大于 100 秒的 HttpClient.Timeout 值将被忽略。这是因为底层 native http 客户端的超时设置为 100 秒,因此当 HttpClient.Timeout 值 > 100 秒时,这会在 .NET HttpClient 超时之前超时。这应该在所有最新的稳定版本中得到修复,因此请确保您已更新。如果您使用的是 Visual Studio 2017,您将没有修复程序,您将需要获取 VS 2019 以获得修复程序。

关于c# - HttpClient 似乎忽略了 Timeout 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57889926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com