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.
虽然我们将我们使用的 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.