gpt4 book ai didi

c# - 运行时的 Xamarin HttpClient 堆栈检测

转载 作者:行者123 更新时间:2023-11-30 16:48:42 25 4
gpt4 key购买 nike

在 Xamarin iOS 应用程序中,我可以指定在运行时使用哪个 HttpClient 实现:

https://developer.xamarin.com/guides/cross-platform/macios/http-stack/

然而,此设置仅影响使用默认构造函数构造的 HttpClients:

var client = new HttpClient()

但是如果我想通过向 ctor 提供自定义 DelegatingHandler 来向我的 http 客户端添加一些请求拦截怎么办?然后我将使用另一个 ctor:

var myDel = new MyDel(RUNTIME_HANDLER_GOES_HERE);
var client = new HttpClient(myDel);

理想情况下,在运行时我需要知道在编译时项目设置中选择了哪个 httpHandler,以便 myDel 在运行时包装它。我该怎么做?

UPD我能够在 mono 的源代码中找到负责选择适当处理程序的代码:https://github.com/mono/mono/blob/master/mcs/class/System.Net.Http/HttpClientEx.cs#L28但是 RuntimeOptions 类是内部类,我只能在运行时通过反射使用它。然而,在这种情况下,Xamarin 的链接器会在 Release模式下从 dll 中剥离 RuntimeOptions,并且应用程序会在发布和临时构建中崩溃,但不会在调试中崩溃。有谁知道在启用链接器的 xamarin 构建中 RuntimeOptions 会发生什么,以便我能够利用它来找出运行时 httphandler?

最佳答案

不要对抗链接器 - 它正在删除它,因为它是一种大小优化,可以只使用所需的处理程序。

但是您仍然可以在其他地方使用反射,链接器无法删除的地方。您可以在我们的 HttpClient sample 中看到这样的示例.这是重要的一行:

typeof(HttpMessageInvoker).GetField("_handler", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue (client).GetType ();

关于c# - 运行时的 Xamarin HttpClient 堆栈检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37841786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com