【问题标题】:Xamarin - HttpClient, establish connection between iOS and serverXamarin - HttpClient,在 iOS 和服务器之间建立连接
【发布时间】:2025-09-12 15:30:05
【问题描述】:

我在 Xamarin 中使用 HTTPClient 来调用我的服务器,但有时请求在 IOS 上需要很长时间,所以我确实使用 wireshark 检查了数据包跟踪,发现服务器没有回复。 Iphone 从服务器发送了SYN 但没有SYN ACK,因此当我使用 HTTPClient.PostAsync() 并在 X 秒后抛出异常 The request timed out。这个问题有时会出现,但不是一直出现,在 Android 上,HttpClient 可以完美运行。

private static HttpClient client = new HttpClient();
try
{
    var response = await client.PostAsync(url, json);
    .....
}
catch (Exception ex)
{
    //exception
}

HttpClient 实现在 NSUrlSession 上。

【问题讨论】:

    标签: xamarin.forms xamarin.ios dotnet-httpclient


    【解决方案1】:

    欢迎来到 SO!

    使用 NSUrlConnectionCFUrlNSUrlSession 建立的任何连接默认情况下在为 iOS 9 和 OS X 10.11(El船长)。

    由于在为 iOS 9 和 OS X 10.11 (El Capitan) 构建的应用中默认启用 ATS,所有使用 NSUrlConnectionCFUrlNSUrlSession 将遵守 ATS 安全要求。如果您的连接不满足这些要求,它们将失败并出现异常。

    ATS 将对所有互联网连接强制执行以下要求:

    • 所有连接密码都必须使用前向保密。请参阅下面接受的密码列表。

    • 传输层安全 (TLS) 协议必须是 1.2 或更高版本。

    • 所有证书必须至少使用具有 2048 位或更大 RSA 密钥或 256 位或更大椭圆曲线 (ECC) 密钥的 SHA256 指纹。

    同样,由于在 iOS 9 中默认启用 ATS,因此任何不满足这些要求的连接尝试都将导致抛出异常。

    另外,如果在xamarin iOS中使用http,可以在info.plist中添加关注内容:

    <key>NSAppTransportSecurity</key>  
    <dict>  
          <key>NSAllowsArbitraryLoads</key><false/>  
    </dict>
    

    参考:App Transport Security in Xamarin.iOS

    【讨论】: