Xamarin iOS HttpClient 超时不起作用

Posted

技术标签:

【中文标题】Xamarin iOS HttpClient 超时不起作用【英文标题】:Xamarin iOS HttpClient Timeout doesn't work 【发布时间】:2018-11-09 15:50:52 【问题描述】:

在某些时候,我们发现我们应用程序中的所有请求在 ios 上的超时时间为 60 秒,尽管我们将我们使用的 HTTP 框架的默认值设置为 3 分钟。我尝试了以下代码来确定是否是库有问题:

try

    using (var http = new HttpClient())
    
        http.Timeout = TimeSpan.FromMinutes(1.5);
        await http.GetAsync("https://httpstat.us/200?sleep=70000");
    

catch (Exception ex)


尽管超时设置为 90 秒并且请求持续了 70 秒,但此代码失败并出现超时异常。原来它不会覆盖默认的 60 秒超时。相同的代码在新项目上运行良好。

在项目文件中我们有<MtouchHttpClientHandler>NSUrlSessionHandler</MtouchHttpClientHandler>

【问题讨论】:

【参考方案1】:

如果您没有创建自己的 NSUrlSessionHandler 实例并在其 .ctor 中提供自定义 NSUrlSessionConfiguration,则 Xamarin 的 NSUrlSessionHandler 使用 默认 NSUrlSessionConfiguration

iOS 中默认的NSUrlSessionConfiguration 超时设置为 60 秒。

因此,在您的 Xamarin.iOS 应用程序项目中,打开 AppDelegate.cs 并在 FinishedLaunching 覆盖中设置默认会话超时参数。

NSUrlSessionConfiguration.DefaultSessionConfiguration.TimeoutIntervalForRequest = 90.0;
NSUrlSessionConfiguration.DefaultSessionConfiguration.TimeoutIntervalForResource = 90.0;

timeoutIntervalForRequest

The timeout interval to use when waiting for additional data.

timeoutIntervalForResource

The maximum amount of time that a resource request should be allowed to take.

回复:https://developer.apple.com/documentation/foundation/nsurlsessionconfiguration#//apple_ref/occ/instp/NSURLSessionConfiguration/timeoutIntervalForRequest

【讨论】:

我会试试的,谢谢。虽然它没有解释为什么同样适用于新项目。 您是否指定 HttpClient 在那个新的 iOS 项目中使用 NSUrlSessionHandler?您可以查看 Xamarin 的 NSUrlSessionHandler 代码,它们不会更改默认的 NSUrlSessionConfiguration 参数,并且 HttpClient 选项不会“通过”,因为更改 default 参数不会很“礼貌”。 当然。两者都使用它。 由于该值可能是全局设置的,我在想我们的其他第 3 方依赖项之一是否可以重置它... @SergeyMetlov 这是可能的,您可以随时在 .ator 中将自己的 NSUrlSessionConfiguration 提供给 NSUrlSessionHandler

以上是关于Xamarin iOS HttpClient 超时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当 API 关闭时,Xamarin 表单依赖注入 HttpClient 超时不起作用

HttpClient 不适用于 Xamarin iOS 版本

HttpClient不适用于使用Xamarin在VS中构建的IO应用程序

Xamarin 表单 HttpClient GetAsync

Xamarin Forms 使用 httpclient 下载 json 文件:ReadAsStringAsync 还是 DownloadFileAsync?

Xamarin Forms HttpClient PostAsync 总是抛出 NSMallocException