2016-06-15 6 views
3

In Xamarin iOS-Anwendung Ich bin in der Lage zu bestimmen, welche Httpclient Implementierung zur Laufzeit nutzen:Xamarin Httpclient Stapel Erkennung in Runtime

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

jedoch nur diese Einstellung wirkt sich HttpClients Standard Ctor welches unter Verwendung:

var client = new HttpClient() 

Aber was ist, wenn ich eine Anfrage Abfangen zu meinem http-Client hinzufügen möchten, indem Sie benutzerdefinierte delegatingHandler auf den ctor? Ich werde dann eine andere Ctor verwenden:

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

Ideal im Runtime muss ich wissen, welche Httphandler wird in der Kompilierung Projekteinstellungen, um myDel ausgewählt es im laufenden Betrieb zu wickeln. Wie mache ich es?

UPD Ich war in der Lage verantwortlich, den Code zu finden für die Auswahl geeigneter Handler in Monos Quelle: https://github.com/mono/mono/blob/master/mcs/class/System.Net.Http/HttpClientEx.cs#L28 jedoch RuntimeOptions Klasse intern ist und ich kann es nur über Reflexion im laufenden Betrieb verwendet werden. In diesem Fall jedoch streift Xamarins Linker RuntimeOptions von der DLL im Freigabemodus ab, und die App stürzt in Release- und Ad-hoc-Builds, aber nicht im Debug ab. Weiß jemand, was mit RuntimeOptions in linker-aktiviertem Xamarin-Build passiert, damit ich es nutzen kann, um Runtime httphandler herauszufinden?

+0

Wenn überhaupt möglich, würde ich für eine kostenlose Testversion an der Xamarin University anmelden und es gibt einen Kurs über dieses Thema, das eine große Hilfe sein könnte. Sein Kurs XAM150 REST Web Services und es erklärt Dinge viel besser als ich. Von was ich erinnere mich von diesem Kurs können Sie die httpClienthandlers in Code vs mit den Projekteinstellungen und Swap zwischen CFNetworkHandler und NSUrlSessionHander je nach Bedarf auf der Grundlage Ihrer DelegatingHandlers, die Sie verwenden möchten . Da Sie dies im Code tun, wissen Sie zur Laufzeit, welchen HTTPClientHandler Sie auf Ihrem HttpClient installieren. – Bearcat9425

+0

@ Bearcat9425 Ja, es scheint mir jetzt, dass Sie richtig sind. Ich kann kontrollieren, welche Handler in meinem DelegatingHandler als innerHandler übergeben werden, ich habe mich nur gefragt, ob es möglich ist zu bestimmen, welcher Handler in den Projekteinstellungen von Xamarin als Standard ausgewählt ist, um ihn über die gesamte Lösung konsistent zu machen und zum Beispiel zu injizieren ausgewählte Handler über Autofac oder was auch immer in den HttpClient meines Dienstes. – FreoN

+0

Ich sehe in dieser Notiz bin ich mir nicht sicher. – Bearcat9425

Antwort

2

Kämpfen Sie nicht den Linker - es entfernt es, weil es eine Größenoptimierung ist, nur die erforderlichen Handler verwenden zu können.

Sie können Reflexion jedoch woanders immer noch verwenden, ein Ort, den der Linker nicht entfernen kann. Sie können ein solches Beispiel in unserer HttpClient sample sehen. Hier ist die wichtige Zeile:

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

Nun ehrlich gesagt ist Reflektion nicht sicher, wenn Sie Linker verwenden, da der Linker nicht weiß, ob Sie bestimmte private/öffentliche APIs in der Kompilierzeit verwenden, da die Mitgliedsnamen fest codiert sind. Aber Ihre Antwort passt am besten. Wenn ich nicht weiß, wie die Interna von HttpClient unter der Haube konstruiert werden, kann ich HttpClient instantiieren und reflektieren (und in diesem Fall wird nichts vom Linker entfernt, weil ich tatsächlich HttpClient in meinem Code verwende), um interne Handler zu bekommen. Nicht sauber aber funktioniert, ja. – FreoN

+2

Der Handler wird leider nicht (z. B. als Eigenschaft) von der öffentlichen API ausgesetzt. Jedoch kann die Reflektion * vom Linker * sicher sein, Sie müssen nur sicherstellen, dass die Information nicht entfernt werden kann (durch Ihren Code oder den Code, den Sie anrufen). In diesem Fall kann 'handler' nicht entfernt werden, wenn Sie' HttpClient' verwenden. Natürlich ist es nicht * sicherer * als die Reflexion selbst, da es sich auf Interna stützt, die sich im Laufe der Zeit ändern können (aber das hat nichts mit dem Linker selbst zu tun). – poupou