Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Xamarin iOS连接到特定服务器超时_Ios_Https_Xamarin_Timeout_Dotnet Httpclient - Fatal编程技术网

从Xamarin iOS连接到特定服务器超时

从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

我有一个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 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);
我在超时时收到的消息是:
任务已取消

我对此做了很多研究,以下是我的发现:

  • 此代码也用于连接到服务器的Windows应用程序
  • 我已通过本机iOS应用程序连接到此服务器
  • 当我尝试通过Fiddler连接并将其设置为解密HTTPS流量时,它工作正常。
  • 我已通过将此添加到应用程序的Info.plist关闭了应用程序传输安全:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key><true/>
    </dict>
    
    NSAppTransportSecurity
    NSAllowsArbitraryLoads
    
  • 我已经从与iOS模拟器相同的机器上运行了ATS诊断工具(
    /usr/bin/nscurl--ATS诊断[URL]
    ),一切都通过了

  • 我更新到了Xamarin的alpha轨迹以获得时间,但仍然得到了超时。(见下文评论)
  • 我可以从应用程序连接到其他内部服务器。我在一个坏服务器和两个工作服务器上运行了测试,发现坏服务器不支持TLS 1.1和RC4,而工作服务器支持TLS 1.1和RC4。然后,我尝试在一台工作的服务器上关闭这两个,试图将其断开,但我仍然可以连接

  • 有人知道还有什么问题吗?还有什么我可以试试的?!我强调了上面关于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上出现问题感兴趣,但鉴于苹果提供商似乎将成为新的默认提供商,在现阶段似乎不值得进一步研究。