6 Stimmen

Eine Web Service Proxy-Klasse entsorgen?

Wenn Sie eine Webdienst-Proxyklasse im ASP.Net-Framework erstellen und verwenden, erbt die Klasse letztendlich von Component, das IDisposable implementiert.

Ich habe noch nie ein Beispiel im Internet gesehen, bei dem eine Web-Proxy-Klasse entsorgt wurde, frage mich aber, ob das wirklich notwendig ist. Wenn ich nur eine Methode aufrufen, ich normalerweise wickeln Sie es in einer using-Anweisung, aber wenn ich eine Notwendigkeit, es mehrmals in der Seite aufrufen, könnte ich am Ende mit der gleichen Instanz, und fragte mich nur, was die Auswirkungen von nicht entsorgen es sind.

8voto

Aaronaught Punkte 118136

Sie müssen Folgendes entsorgen alles die Folgendes implementiert IDisposable .

Die Umsetzung der IDisposable bedeutet, dass sich das Objekt an etwas die der Garbage Collector nicht wirklich verfolgt - das kann eine Verbindung, eine Datei oder ein anderes Handle sein - oder auch gar nichts, das spielt keine Rolle. Sie sollten sich nicht mit den Implementierungsdetails befassen, denn diese können sich ändern.

Die Klasse kann, muss aber nicht wirklich unverwaltete Ressourcen verwenden. Sie kann einen Finalizer haben oder nicht. Es macht kaum einen Unterschied; wenn die Klasse Folgendes implementiert IDisposable dann fordert es Sie auf Dispose wenn Sie fertig sind. Auch wenn die Dispose Methode nichts tut, weiß man nie, wann jemand den Verweis auf diese Klasse durch einen Verweis auf eine Unterklasse ersetzt, die wirklich tut entsorgt werden müssen.

6voto

epotter Punkte 7441

Die kurze Antwort ist, dass Sie bei Webdienst-Proxyklassen diese schließen und nicht entsorgen sollten.

In fast allen Fällen sollten Sie Dinge entsorgen, die IDisposable. Web Service Proxy-Klassen sind jedoch ein Sonderfall. Bei diesen Klassen, und allen Klassen, die von System.ServiceModel.ClientBase ist es eine bewährte Praxis pas dispose aufzurufen, sondern die Close-Methode direkt aufzurufen.

Anhand des Reflektors können Sie sehen, dass die Dispose Methode der ClientBase ruft einfach Close . Wenn es also keine Ausnahmen gibt, Dispose y Close wird das Gleiche tun. Wenn es jedoch eine Ausnahme gibt, wird es unterschiedliche Verhaltensweisen geben.

Weil die Close Methode Ausnahmen auslösen kann, sollten Sie sie direkt aufrufen und ihre Ausnahme abfangen. Wenn Sie die Dispose Methode, sollten Sie auch die Ausnahmen abfangen, aber Ihr Code wird schwerer zu verstehen sein.

Das bedeutet auch, dass Sie vermeiden sollten, die Deklaration des Proxys in eine using Erklärung. In diesem Fall, wenn eine Ausnahme in der using Block, wird er verdeckt. Die Website Dispose Aufruf, der automatisch von der using Block wird aufgerufen, weil er sich in einem finally Block. Die Ausnahme, die von der Close im Dispose wird die zuvor ausgelöste Ausnahme überdecken.

Ausführlichere Erklärungen finden Sie in den folgenden Artikeln auf MSDN , Coding Up Style , BlogginAbout.Net y StackOverflow .

Die Hintergründe, warum es auf diese Weise umgesetzt wird, finden Sie in diesem Thread auf der MSDN-Foren .

3voto

Henk Holterman Punkte 249753

Manchmal ist Dispose() nur ein Dummy (geerbt von einer Basisklasse), aber dann ist es immer noch eine gute Praxis, es aufzurufen, um für zukünftige Änderungen sicher zu sein.

Ein WebService/WCF-Proxy est eine Verbindung hält, ist es sicherlich eine gute Idee, Dispose() oder Close() aufzurufen. Dies innerhalb eines using-Blocks zu tun, ist natürlich vorzuziehen, da es ausnahmesicher ist.

Aber in Ihrem Fall (Verwendung des Proxys in mehreren Methoden auf Ihrer Seite) würde die Verwendung mehrerer using-Blöcke wahrscheinlich zu Leistungseinbußen führen. Es ist in Ordnung, die using-Blöcke durch einen Aufruf von Close() in einem Ereignis zu ersetzen, das spät im Seitenzyklus kommt. Ich bin mir nicht sicher über die ASP.NET Best Practices hier, aber ich würde OnPreRender oder OnPageUnload oder etwas anderes verwenden.

Sie werden die Ausnahmesicherheit hier verlieren, aber das ist kein grundsätzliches Problem, der GC wird das lösen.

1voto

gvaish Punkte 9254

IMHO gibt es nichts Besseres als eine Web-Service-Proxy-Klasse zu entsorgen.

Die meisten der Bevollmächtigten sind:

  • Zustandslos, d.h. es macht keinen Unterschied, ob man eine oder mehrere Instanzen verwendet.
  • Intermittierend, d. h. sie schließen die Verbindung, sobald alle Antworten verarbeitet wurden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X