2011-09-02 11 views
10

Mam aplikację, która wielokrotnie używa tego samego kanału WCF. Zachowuję statyczne odwołanie przez obiekt fabryczny. Zastanawiam się, czy to dobrze, czy powinienem otworzyć x kanałów i zaokrąglić wszystkie połączenia usług przez te kanały, zamiast korzystać z pojedynczego kanału?Pojedyncza wydajność kanału WCF w stosunku do wielu kanałów

Czy te wywołania serwisowe są umieszczane w kolejce, jeśli używa się tylko jednego kanału, czy też dzieje się tak samo, gdy korzystam z x kanałów?

Odpowiedz

11

Powinieneś użyć fabryki z jednym kanałem dla wszystkich wniosków, ale dla każdego żądania należy zbudować różne kanały. Nigdy nie używaj ponownie kanałów. Nie są one kosztowne w tworzeniu i nie są bezpieczne dla wątków. Kosztowne jest stworzenie fabryki kanałów. Jest bezpieczny dla wątków i może być ponownie użyty. Oczywiście, jeśli fabryka kanału przejdzie w stan błędu, może być konieczne ponowne otwarcie.

+1

Trzymanie obiektu ICommunicationObject przez _channelFactory.CreateChannel() nie jest dobrym pomysłem? Teraz mam otwarty 1 kanał dla wszystkich żądań, nie robię _channelFactory.CreateChannel() dla każdego połączenia, używam ponownie statycznego, utworzonego po raz pierwszy. –

+1

@Bjorn Bailleul, nie jest to dobry pomysł. Instancje zwracane przez '_channelFactory.CreateChannel()' powinny być jak najkrótsze i nigdy nie mogą być ponownie użyte. Jak już powiedziałem, połączenie "CreateChannel" nie jest drogie. To jest bardzo szybkie. Możesz zadzwonić do każdego żądania. Kosztowne jest stworzenie fabryki kanałów. To jest pamięć podręczna. –

+1

@Darin - Czy masz referencję lub link do "użyj innego kanału dla każdego połączenia". Ten blog jest jednym z najczęściej cytowanych artykułów na temat fabryk kanału, a jego pierwszą najlepszą praktyką jest "Ponownie użyj tego samego serwera proxy": http://blogs.msdn.com/b/wenlong/archive/2007/10/27/performance -poprawa-wcf-client-proxy-creation-and-best-practices.aspx – ErnieL

6

@Darin Dimitrov

używać tego samego proxy W wielu przypadkach, co chcesz używać tego samego serwera proxy. Ma najlepszą wydajność. Jest to szczególnie ważne w przypadku korzystania z funkcji zabezpieczeń, ponieważ wstępna negocjacja zabezpieczeń może wiązać się z wysokimi kosztami.

proxy to kanał. jeśli spojrzeć na this blog post można zobaczyć następujący fragment kodu:

ISimpleContract proxy = factory.CreateChannel(); 
((IClientChannel)proxy).Open(); 

Ponadto, jeśli masz zamiar pracować z sesji, nie chcesz, aby ustanowić nową sesję dla każdego żądania (poprzez stworzenie nowego kanału/proxy za każdym razem).

Powiązane problemy