我正在开发一个跨平台的Xamarin Forms应用程序,我希望能够使用平台特定的 HttpMessageHandler
子类 AndroidClientHandler
和 NSUrlSessionHandler
分别,当我初始化 HttpClient
对象。
为了达到这个目的,我正在配置Android和iOS应用项目,使其使用原生的HTTP客户端实现,然后我使用无参数构造函数初始化 HttpClient
:
var client = new HttpClient();
然而,我还想确保 AllowAutoRedirect
和 UseCookies
的消息处理程序设置为 false
. 没有 Handler
中的财产 HttpClient
类中。我如何确保这些处理程序属性在隐式初始化的处理程序对象中被正确设置?
因为这是跨平台的代码,所以我希望尽可能避免在处理过程中使用 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标准 处理程序,所以,如果你在共享项目中初始化处理程序,或者在本地项目中继承它,它们是同一类型的类。所以,如果你在共享项目中初始化了处理程序,或者在本地项目中继承了它,它们都是同一类型的类。
在你的共享项目中,你可以像这样简单地初始化客户端。
var handler = new HttpClientHandler
{
AllowAutoRedirect = false,
UseCookies = false
};
var client = new HttpClient(handler);
然而,这种方式你将覆盖 "本地 "处理程序,并使用HttpClientHandler来代替。
基于评论和编辑的问题的补充说明。
回答你的问题 -- 没有,没有任何内置的方法来获取HttpClientHandler。AndroidClientHandler
在共享代码中。你必须自己暴露它。你也可以写你自己的本地处理程序,并通过一个 DependencyService
然后用它们调用ctor。后者我过去也做过,没有问题。