【发布时间】:2016-06-15 17:15:44
【问题描述】:
在 Xamarin iOS 应用程序中,我可以指定在运行时使用哪个 HttpClient 实现:
https://developer.xamarin.com/guides/cross-platform/macios/http-stack/
但是这个设置只影响使用默认 ctor 构造的 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 的链接器在发布模式下从 dll 中剥离 RuntimeOptions,并且应用程序在发布和临时构建中崩溃,但在调试中没有。有谁知道在启用链接器的 xamarin 构建中 RuntimeOptions 会发生什么,所以我可以利用它来找出运行时 httphandler?
【问题讨论】:
-
如果可能的话,我会在 Xamarin 大学注册一个免费试用版,并且有一个关于这个主题的课程可能会有很大帮助。它的课程 XAM150 REST Web 服务,它比我更好地解释了一些事情。根据我从该课程中记得的内容,您可以在代码中设置 httpClienthandlers 与使用项目设置,并根据您想要使用的 DelegatingHandlers 在 CFNetworkHandler 和 NSUrlSessionHander 之间进行交换.由于您在代码中执行此操作,因此您在运行时就知道要安装哪个 HTTPClientHandler 到您的 HttpClient。
-
@Bearcat9425 是的,现在在我看来你是对的。我当然可以控制将哪些处理程序作为 innerHandler 传递给我的 DelegatingHandler,我只是想知道是否有能力确定在 Xamarin 的项目设置中选择哪个处理程序作为默认处理程序,以尝试使其在整个解决方案中保持一致,例如注入通过 Autofac 或其他任何方式选择处理程序进入我的服务的 HttpClient。
-
我在那个纸条上看到我不确定。
标签: c# xamarin xamarin.ios httpclient