xamarin HttpClient 的扩展性并添加对本机平台网络堆栈的支持

了解HttpClient的局限性及如何通过使用NSUrlSessionHandler和AndroidClientHandler提升其性能。这些处理程序能让HttpClient利用本机网络堆栈,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HttpClient 是托管实现,这意味着它无法感知本机平台网络堆栈。 因此,HttpClient 无法使用每个平台的本机网络功能,这让它达不到应有的效率且优化程度也会降低。

在本单元中,利用 HttpClient 的扩展性并添加对本机平台网络堆栈的支持。

HttpClient 的问题
默认情况下,HttpClient 使用基于较低级别的操作系统接口的托管网络堆栈。 因此,HttpClient 无法感知每个平台上的网络堆栈。 Android 和 iOS 都具有更高效的本机网络堆栈,但它们的 API 具有唯一性,这让通过 C# 进行使用变得更加困难。

因此,HttpClient 无法充分利用本机平台。 例如,本机网络堆栈有一项功能,在手机网络数据关闭时会自动尝试开启该选项。 因为 HttpClient 在默认情况下不使用本机网络堆栈,所以它不会尝试打开该选项。

什么是消息处理程序?
HttpClient 设计为可扩展,并支持消息处理程序,以影响它传输信息和处理常见 HTTP 方案的方式。 例如,Microsoft 创建了名为 HttpClientHandler 的消息处理程序。 可使用它来自定义 HttpClient 的某些功能。 以下示例显示 HttpClientHandler 的用法:

var handler = new HttpClientHandler() {
   AllowAutoRedirect = false,
   UseProxy = true,
   AutomaticDecompression = DecompressionMethods.GZip,
   Credentials = new NetworkCredential("user", "passwd")
};
var client = new HttpClient(handler);

正如你所看到的,HttpClientHandler 具有可设置为自定义 HttpClient 的行为的属性。 若要将自定义项应用于 HttpClient,请将其传入构造函数。

什么是 NSUrlSessionHandler?
Xamarin.iOS 包括名为 NSUrlSessionHandler 的消息处理程序,这有助于 HttpClient 使用其本机网络堆栈。 NSUrlSessionHandler 提供以下优势:

在开始请求之前自动打开收发器。
利用 iOS 连接池。
使用调度队列而不是托管线程。
处理网络时,处理程序使 HttpClient 像本机应用程序一样工作。

在代码中设置 NSUrlSessionHandler 如以下示例所示:

var client = new HttpClient(new NSUrlSessionHandler());

现在,HttpClient 具有本机网络堆栈的优势。

什么是 AndroidClientHandler?
与 Xamarin.iOS 一样,Xamarin.Android 包括名为 AndroidClientHandler 消息处理程序。 AndroidClientHandler 将网络通信工作推送到 Android UrlConnection 堆栈上。 此处理程序允许 HttpClient 使用 Android 知晓如何处理的任何网络协议和加密协议,例如 TLS 1.2。

在代码中设置 AndroidClientHandler 如以下示例所示:

var client = new HttpClient(new AndroidClientHandler());

何时使用 NSUrlSessionHandler 和 AndroidClientHandler
作为通用指南,使用 HttpClient 时,始终使用 NSUrlSessionHandler 和 AndroidClientHandler。 它们都提供本机网络堆栈具有的优点。

使用这些处理程序是新的 Xamarin.Forms 项目的默认行为。 可以通过项目设置来更改 HttpClient 默认值。

若要更改 Xamarin.iOS 的默认 HttpClient 处理程序,请打开 iOS 项目的属性。 在“iOS 生成”选项卡下,有一个“HttpClient 实现”选项。 如果将此选项设置为 NSUrlSession,HttpClient 会使用本机 iOS 处理程序,并且不会将其传递到构造函数中。

若要更改 Xamarin.Android 的默认 HttpClient 处理程序,请打开 Android 项目的属性。 在“Android 选项”选项卡下方,单击底部的“高级”按钮。 在“高级 Android 选项”对话框中,有一个“SSL/TLS 实现”选项。 将此值设置为 Native TLS 1.2+ 会使 HttpClient 默认使用消息处理程序。

什么是应用传输安全性?
在总结本单元之前,在 iOS 上使用本机网络堆栈时,还需记住一点。 应用传输安全性是一项功能,要求通过本机网络堆栈完成的每次网络通信都使用 TLS 1.2 或以上版本。 如果其中一个长期密钥泄露,现代加密算法不会泄露信息。

如果应用不遵守这些规则,则无法访问网络。 如果应用程序存在此问题,有两种选择。 第一种,可以更改终结点以遵循应用传输安全性策略。 第二种,可以通过设置 Info.plist 文件中的某些密钥来选择退出应用传输安全性。

选择退出应用传输安全性
若要选择退出应用传输安全性,必须将新的密钥添加到名为 NSAppTransportSecurity 的 Info.plist 文件。 在该字典中,添加另一个名为 NSExceptionDomains 的密钥。 它包含想要将其作为目标的每个终结点的子级。 以下是选择退出某个终结点时所添加内容的示例:

<key>NSAppTransportSecurity</key>
<dict>
   <key>NSExceptionDomains</key>
      <dict>
      <key>xam150.azurewebsites.net</key>
      <dict>
         <!-- specific options here -->
      </dict>
   </dict>
</dict>

在此示例中,我们向位于 xam150.azurewebsites.net 的终结点添加了一个异常。 可以添加相关选项,以便更具体地说明想要选择退出的方式。该指南超出了本模块的范畴。 这些选项在 Apple 网站上记录。

最后,如果无法识别所有终结点,请通过使用 NSAllowsArbitraryLoads 密钥禁用所有未指定终结点的应用传输安全性。 下面是代码中的一个示例:

<key>NSAppTransportSecurity</key>
<dict>
   <key>NSAllowsArbitraryLoads</key>
   <true/>
</dict>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值