我正在开发一个跨平台的Xamarin窗体应用程序,在初始化HttpMessageHandler对象时,我希望能够分别使用特定于平台的AndroidClientHandler和NSUrlSessionHandler子类。
为此,我将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的答案可能就足够了。
发布于 2020-06-02 08:33:31
您不需要公开本机处理程序并为这两个平台实现它。正如您所述,HttpClient接受处理程序的重载。但是,该处理程序是一个.NET标准处理程序。因此,如果在共享项目中初始化处理程序,或者在本机项目中继承处理程序,它们是相同类型的类。
在您的共享项目中,您可以这样简单地初始化客户机:
var handler = new HttpClientHandler
{
AllowAutoRedirect = false,
UseCookies = false
};
var client = new HttpClient(handler);但是,通过这种方式,您将覆盖“本机”处理程序并使用HttpClientHandler。
根据评论和经编辑的问题提出的补充意见:
要回答您的问题--不,在共享代码中有任何内置的方法来获取AndroidClientHandler。你得亲自揭发。您还可以编写自己的本机处理程序,并通过DependencyService公开它们,然后使用它们调用ctor。后者是我过去做过的,没有任何问题。
https://stackoverflow.com/questions/62147488
复制相似问题