2010-05-13 17 views
6

Podczas tworzenia i korzystania z klasy proxy usługi sieci Web w środowisku ASP.Net, klasa ostatecznie dziedziczy z komponentu, który implementuje IDisposable.Pozbyć się klasy usługi Web Service Proxy?

Nigdy nie widziałem jednego przykładu w Internecie, gdzie ludzie pozbywają się klasy proxy sieci, ale zastanawiałem się, czy naprawdę trzeba to zrobić. Kiedy wywołuję tylko jedną metodę, zwykle pakuję ją w instrukcję użycia, ale jeśli potrzebuję wywołać ją kilka razy na całej stronie, mogę skończyć używając tej samej instancji i zastanawiam się, jakie są konsekwencje to.

Odpowiedz

8

Musisz dysponować wszystko, co, który implementuje IDisposable.

Realizacja IDisposable oznacza, że ​​obiekt posiada na coś że garbage collector nie iskrobezpiecznej utwór - może być połączenie może być plik, może być jakiś inny uchwyt - czy może być w ogóle nic, to naprawdę nie ma znaczenia. Nie powinieneś zajmować się szczegółami implementacji, ponieważ mogą one ulec zmianie.

Klasa może, ale nie musi, używać niezarządzanych zasobów. Może lub nie może mieć finalizatora. To ma niewielką różnicę; jeśli klasa implementuje IDisposable, po zakończeniu prosi o to Dispose. Nawet jeśli metoda Dispose nic nie robi, nigdy nie wiadomo, kiedy ktoś zastąpi odwołanie do tej klasy odwołaniem do podklasy, która naprawdę musi zostać usunięta.

3

Czasami Dispose() jest tylko manekinem (odziedziczonym z klasy bazowej), ale nadal dobrym zwyczajem jest wywoływanie go, aby być bezpiecznym dla przyszłych zmian.

Serwer proxy usługi WebService/WCF jest posiadający połączenie, więc z pewnością warto wywołać funkcję Dispose() lub Close(). Zrobić to w bloku przy użyciu jest oczywiście preferowane, ponieważ jest wyjątkowo bezpieczne.

Ale w twoim przypadku (używając serwera proxy w wielu metodach na twojej stronie) użycie wielu bloków prawdopodobnie spowodowałoby trafienie wydajnościowe. Można zastąpić bloki przy użyciu wywołania Close() w zdarzeniu spóźnionym w cyklu stron. Nie mam pewności co do najlepszych praktyk ASP.NET, ale użyłbym OnPreRender lub OnPageUnload lub czegoś podobnego.

Utracisz tutaj wyjątkowe bezpieczeństwo, ale to nie jest podstawowy problem, a GC to rozwiąże.

1

IMHO, nie ma to jak zrzucenie klasy proxy usług sieciowych.

Większość serwerów proxy są:

  • Stateless, jako takiego powołania, używając jednej instancji lub przy użyciu wielu wystąpień, nie czyni żadnej różnicy
  • Przerywany znaczenia, że ​​zamykają połączenie jak najszybciej wszystkie odpowiedzi są przetwarzane
6

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.

+1

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

Powiązane problemy