从Xamarin iOS连接到特定服务器超时
我有一个Xamarin iOS应用程序,当连接到许多内部https服务器时会超时(10分钟)。应用程序用于连接的代码为:从Xamarin iOS连接到特定服务器超时,ios,https,xamarin,timeout,dotnet-httpclient,Ios,Https,Xamarin,Timeout,Dotnet Httpclient,我有一个Xamarin iOS应用程序,当连接到许多内部https服务器时会超时(10分钟)。应用程序用于连接的代码为: HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, uri); [Headers and content are added to message here - I can't easily post up the details for security reasons, but if
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, uri);
[Headers and content are added to message here - I can't easily post up
the details for security reasons, but if anyone thinks that that might
be causing the problem, I'll work something out.]
System.Net.Http.HttpClientHandler handler = new System.Net.Http.HttpClientHandler();
handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(handler);
client.MaxResponseContentBufferSize = 900000000;
client.Timeout = TimeSpan.FromSeconds(600);
HttpResponseMessage response = await client.SendAsync(message, HttpCompletionOption.ResponseHeadersRead);
我在超时时收到的消息是:任务已取消
我对此做了很多研究,以下是我的发现:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
NSAppTransportSecurity
NSAllowsArbitraryLoads
/usr/bin/nscurl--ATS诊断[URL]
),一切都通过了有人知道还有什么问题吗?还有什么我可以试试的?!我强调了上面关于Fiddler的一点,因为我怀疑这可能是一个很大的线索——当服务器以解密模式通过Fiddler连接时,它与应用程序的外观有何不同?关于Fiddler;Fiddler实际上使用中间人方法连接到您的服务器,而应用程序正在连接到Fiddler(它为您的应用程序生成SSL证书进行协商)。在iOS传输安全方面,需要TLS协议版本1.2(除非ATS关闭)。前向保密性也是一项要求,以及支持的适合RSA 2048+位密钥的密码等。。假设您将
NSAllowsArbitraryLoads
添加到正确的plist,并且无法连接,则这不是ATS问题。苹果的文档实际上说,“看看别处”:-/如果ATS不是根本问题,我会将NSAllowsArbitraryLoads
设置为true,而不使用SSL作为该服务器的起点。只使用HTTP,你能连接吗?在那之后,使用透明代理的Wiresharking是一种观察已知良好服务器与“坏”服务器的工作方式。我尽可能确定我使用了正确的plist,而且我猜nscurl
检查会突出显示任何问题。至于HTTP,服务器有一个网关,用于将HTTP请求转换为HTTPS。我也许可以暂时关闭这个规则,但现在要等到星期一。我会告诉你结果的!对System.Net.Http的任何调用都会绕过ATS,因此您的ATS设置是什么并不重要。由于您的代码在Windows应用程序中运行良好,我怀疑同样的呼叫在iOS端被终止。我相信我在上传大型音频文件之前遇到了同样的问题,它通过切换到NSUrlSession解决了这个问题。由于要将文件发布到服务器,因此最好使用后台配置切换到NSUrlSession。这将允许你的上传在后台继续上传,即使用户将你的应用发送到后台。我没有这个问题的答案,但解决方法是使用最新的Xamarin alpha。(我原以为我已经通过更新Xamarin完成了这项工作,但我错过了一个额外的步骤)。我仍然对Mono TLS提供商为何在iOS上出现问题感兴趣,但鉴于苹果提供商似乎将成为新的默认提供商,在现阶段似乎不值得进一步研究。