Xamarin iOS HttpClient 超时不起作用

3

在某个时刻,我们发现我们应用中所有请求在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个回答

3
Xamarin的NSUrlSessionHandler在你不自己创建NSUrlSessionHandler实例并提供自定义NSUrlSessionConfiguration时,会使用默认的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

这是一个关于NSURLSessionConfiguration.timeoutIntervalForRequest属性的文档链接,它是用于设置请求超时时间的。如果在指定时间内没有收到服务器响应,则会停止该请求并发出错误。默认情况下,该属性设置为60秒。

你是否在新的iOS项目中指定了HttpClient使用NSUrlSessionHandler?你可以查看Xamarin的NSUrlSessionHandler代码,它们不会更改默认的NSUrlSessionConfiguration参数,并且HttpClient选项不会被“传递”,因为更改默认参数并不是很“礼貌”。 - SushiHangover
当然。两者都使用它。 - Sergey Metlov
由于该值可能是全局设置的,我在想我们的其他第三方依赖项是否可以重置它... - Sergey Metlov
@SergeyMetlov 这是可能的,你可以在.ator中为NSUrlSessionHandler提供自己的NSUrlSessionConfiguration - SushiHangover
@Marc_Alx 请查看“会话配置类型”:https://developer.apple.com/documentation/foundation/nsurlsessionconfiguration - SushiHangover
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接