如何在自定义 HttpMessageHandler 中设置属性?

How to set properties in a custom HttpMessageHandler?

我正在开发一个跨平台的 Xamarin Forms 应用程序,我希望能够使用特定于平台的 HttpMessageHandler subclasses AndroidClientHandlerNSUrlSessionHandler 分别在我初始化 HttpClient 对象时。

为此,我将 Android 和 iOS 应用程序项目配置为使用本机 HTTP 客户端实现,然后使用无参数构造函数初始化 HttpClient:

var client = new HttpClient();

不过,我还想确保消息处理程序的 AllowAutoRedirectUseCookies 设置为 falseHttpClientclass中没有Handler属性。如何确保在隐式初始化的处理程序对象中正确设置这些处理程序属性?

由于这是跨平台代码,我想尽可能避免诉诸于使用 HttpClient(HttpMessageHandler) 构造函数并显式传入特定于平台的处理程序实例。如果可能的话,我希望能够预先配置在无参数构造函数中初始化的处理程序的属性。

编辑

从 API 文档中,很容易得出这样的印象:如果将 HttpClientHandler 对象传递给 HttpClient 构造函数,将应用特定于平台的处理程序实现:

var handler = new HttpClientHandler
{
  AllowAutoRedirect = false,
  UseCookies = false
};
var client = new HttpClient(handler);

不幸的是,上述方法在实践中不起作用。使用这种方法,将实例化一个 HttpClientHandler 对象,而不管 HttpClient 实现是否具有已在项目设置中设置为本机。

理论上,一种替代方法是,如果有任何方法可以获取在无参数构造函数中初始化的处理程序实例,修改它并将修改后的实例传递给 HttpMessageHandler 参数构造函数,一些像这样:

var handler = GetHandlerInstanceAppliedInParameterlessHttpClientConstructor();
handler.AllowAutoRedirect = false;
handler.UseCookies = false;
var client = new HttpClient(handler);

但是,我不知道有任何方法返回这样的处理程序实例。

我还应该指出,我现在主要关心的是 Android,因此主要适用于 Android 的答案可能就足够了。

您不需要公开本机处理程序并为两个平台实现它。 HttpClient 接受带有处理程序的重载,如您所述。但是,该处理程序是 .NET Standard 处理程序。因此,如果您在共享项目中初始化处理程序,或者在本机项目中从它继承,它们是相同类型的 class.

在您的共享项目中,您可以像这样简单地初始化客户端:

var handler = new HttpClientHandler
{
    AllowAutoRedirect = false,
    UseCookies = false
};
var client = new HttpClient(handler);

但是,这样您将覆盖 "native" 处理程序并改用 HttpClientHandler。

基于评论和已编辑问题的补充说明:

回答您的问题 - 不,没有任何内置方法可以在共享代码中获取 AndroidClientHandler。你必须自己揭露它。您还可以编写自己的本机处理程序并通过 DependencyService 公开它们,然后使用它们调用构造函数。后者我过去做过,没有任何问题。