Krótka odpowiedź brzmi, że w przypadku klas usługi proxy usług internetowych należy je zamknąć, a nie usuwać.
W niemal każdym przypadku należy pozbyć się rzeczy, które implementują IDisposable. Jednak klasy proxy usług sieci Web są szczególnym przypadkiem.W przypadku tych klas i wszystkich klas, które dziedziczą po System.ServiceModel.ClientBase
, najlepszą praktyką jest , a nie wywoływanie wywołań, ale wywołanie metody Zamknij bezpośrednio.
Używając reflektora, można zauważyć, że metoda z poziomu ClientBase
po prostu wywołuje Close
. Więc jeśli nie ma wyjątków, Dispose
i Close
zrobi to samo. Jeśli jednak istnieje wyjątek, będą różne zachowania.
Ponieważ metoda Close
może generować wyjątki, należy wywołać ją bezpośrednio i wychwycić wyjątek. Jeśli wywołasz metodę Dispose
, powinieneś również wychwycić wyjątki, ale Twój kod będzie trudniejszy do zrozumienia.
Oznacza to również, że należy unikać umieszczania oświadczenia pełnomocnika w oświadczeniu using
. W takim przypadku, jeśli wyjątek zostanie zgłoszony w bloku using
, będzie on zasłonięty. Wywołanie Dispose
wygenerowane automatycznie przez blok using
zostanie wywołane, ponieważ znajduje się w bloku finally
. Wyjątek wyrzucony z Close
w Dispose
spowoduje zaciemnienie wyjątku, który został wcześniej zgłoszony.
Aby zobaczyć bardziej szczegółowe wyjaśnienia, przeczytaj te artykuły na temat MSDN, Coding Up Style, BlogginAbout.Net i StackOverflow.
Aby zapoznać się z historią dotyczącą tego, dlaczego jest zaimplementowany w ten sposób, sprawdź ten wątek na stronie MSDN forums.
Należy zauważyć, że te łącza są specyficzne dla odwołań usługi WCF, a nie odwołań do sieci Web .NET 2.0. Ma to wpływ na sposób tworzenia proxy. – TrueWill