Xamarin iOS HttpClient 超时不起作用

Xamarin iOS HttpClient Timeout doesn't work

虽然我们将我们使用的 HTTP 框架的默认值设置为 3 分钟,但在某些时候我们发现我们应用程序中的所有请求在 iOS 上都有 60 秒的超时。我尝试了以下代码以确定是否是图书馆有问题:

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>

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

在 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