【发布时间】:2020-06-02 08:04:50
【问题描述】:
我正在开发一个跨平台的 Xamarin Forms 应用程序,我希望能够在初始化 HttpClient 对象时分别使用平台特定的 HttpMessageHandler 子类 AndroidClientHandler 和 NSUrlSessionHandler。
为此,我将 Android 和 iOS 应用程序项目配置为使用本机 HTTP 客户端实现,然后使用无参数构造函数初始化 HttpClient:
var client = new HttpClient();
但是,我还想确保消息处理程序的AllowAutoRedirect 和UseCookies 设置为false。 HttpClient 类中没有 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 的答案可能就足够了。
【问题讨论】:
标签: xamarin.forms xamarin.android dotnet-httpclient