Eine kurze Antwort ist, dass Sie es nicht entsorgen müssen, obwohl es eine gute Übung ist, alle IDisposable
Objekte, die Sie besitzen, zu entsorgen.
In der Tat versucht WebException.Response
oder den Strom von ihm zurück entsorgen würde zu Problemen führen, die Sie erwähnt, da Sie Code seine Eigenschaften versucht, die auftreten können in der oberen Verbindungskette der Exception-Handler zu lesen.
Der Grund, warum es nicht sicher zu entsorgen ist, ist HttpWebRequest
intern macht einen Speicher-Stream aus dem Netzwerk-Stream, bevor es WebException
wirft, und der zugrunde liegende Netzwerk-Stream wurde bereits geschlossen/entsorgt. Es hat also zu diesem Zeitpunkt keine unmanaged Ressource. Ich nehme an, es war eine Entscheidung, die es einfacher macht, mit der Ausnahme umzugehen.
Leider MSDN Dokumentation hat keine Erklärung für dieses Verhalten. Technisch gesehen kann sich die Implementierung in Zukunft ändern, was zu einem Problem in Ihrem Code führt, das den HttpWebResponse
und/oder den zugehörigen Stream von WebException
nicht enthält, aber es ist sehr unwahrscheinlich, dass dieses Verhalten die Implementierung ändern würde, da viele Anwendungen vom aktuellen Verhalten abhängen.
Ich muss hinzufügen, dass es eine gute Praxis ist, dass Sie IDisposable
Objekte, die Sie besitzen, entsorgen müssen. Wenn möglich, verwenden Sie stattdessen die Klasse HttpClient
, damit Sie sich nicht mit dieser Situation befassen müssen. Wenn Sie das nicht können, sollten Sie die WebException
selbst behandeln und einen neuen Ausnahmetyp auslösen, der WebException
nicht dem Aufrufer Ihres Codes aussetzt, sodass Sie nicht in eine Situation geraten, in der ein Aufrufer versucht, auf WebException.Response
zuzugreifen, nachdem Sie ihn entsorgt haben .
Haftungsausschluss: Ich arbeite für Microsoft, aber dies entspricht nicht meinem Arbeitgeber oder der Ansicht des .NET Framework-Teams. Keine Garantie impliziert.
Mögliche Duplikate von [Wie ordne ich eine WebResponse-Instanz ordnungsgemäß ab?] (Https://stackoverflow.com/questions/1887314/how-to-properly-dispose-of-a-webresponse-instance) – Deantwo