HttpClient von .NET
06.09.2016, 00:00 Uhr
Fehlerhaft implementiert?
In einem Beitrag weist Autor Simon Timms darauf hin, dass sich die Klasse HttpClient von .NET nicht so verhält, wie es die Dokumentation nahelegt.
Unter .NET sollen Klassen, die externe Ressourcen verwenden, das Interface IDisposable implementieren. Damit lässt sich dann unter C# die Erzeugung eines solchen Objekts in ein using-Statement wie hier
using (var http = new HttpClient()) { }
einpacken. Der Vorteil: Die Magie im Hintergrund sorgt dafür, dass Dispose() automatisch aufgerufen wird und damit alle externen Ressourcen freigegeben werden, wenn der Scope des using verlassen wird. Eine sichere Sache also.
Beim HttpClient ist das nicht anders, oder? Wie Simon Timms aber in seinem Beitrag auf The ASP.NET Monsters zeigt, führt das Einbinden von HttpClient in dieser Weise zu offenen Verbindungen, die erst nach einem Timeout geschlossen werden. Das wiederum kann dazu führen, dass der Pool an Verbindungen irgendwann erschöpft ist und die Anwendung seltsame Fehlermeldungen ausspuckt.
Er schlägt einen Workaround vor: HttpClient-Objekt statisch ablegen und für alle Anfragen verwenden:
private static HttpClient Client = new HttpClient(); public static void Main(string[] args) { Console.WriteLine("Starting connections"); for(int i = 0; i<10; i++) { var result = Client.GetAsync("http://aspnetmonsters.com").Result; Console.WriteLine(result.StatusCode); } Console.WriteLine("Connections done"); Console.ReadLine(); }
[tib]