2009-07-30 19 views
5

Mam klasę kontrolera mvc, która używa usługi WCF (WSHttpBinding), czasami wiele połączeń w ramach jednego żądania http, i chce wiedzieć, jak kosztowne jest utworzenie klienta dla tej usługi. Czy można utworzyć instancję klienta dla każdego połączenia lub czy powinienem utworzyć zmienną składową w klasie?Utworzenie klienta WCF

public class RingbacksController : Controller 
{ 
    private void LoadContactsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 
} 

lub

public class RingbacksController : Controller 
{ 
    private RingbackServiceClient client = new RingbackServiceClient(); 

    private void LoadContactsIntoViewData(int page) 
     { 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
     ... 
     client.Close(); 
    } 
} 

Odpowiedz

1

Jeżeli zdecydujesz się iść z członka, proszę pamiętać, że gdy robi się nic zarzucić, potem wszystkie połączenia nie powiedzie się. Jeśli chodzi o to, czy warto, proponuję benchmarking.

3

Tworzenie klienta zazwyczaj nie jest bardzo kosztowną operacją - więc powinieneś go dokładnie tworzyć, kiedy tylko go potrzebujesz (jak wspomniał Steven) - jeśli to błąd z powodu błędu, i tak musisz to zrobić) .

Jeśli używasz ChannelFactory do utworzenia kanału (to jeden ze sposobów, aby to zrobić), tworzenie ChannelFactory z drugiej strony jest dość ciężką i czasochłonną operacją, więc dobrze byłoby, aby zawieszaj się w instancji ChannelFactory tak długo, jak możesz.

Marc

+0

To nadal dotyczy .NET 4.5: http://msdn.microsoft.com/en-us/library/hh314046(v=vs.110).aspx –

2

W przeszłości, mam stworzył nową instancję ChannelFactory <> i klient/serwer proxy dla każdego wywołania usługi WCF. Nie miałem z tym żadnych problemów, szczególnie nie dla wydajności. Aplikacja, którą napisałem, została wdrożona w wewnętrznej sieci firmowej (lokalna sieć LAN), w której około 30 klientów Windows Forms łączyłoby się z moją usługą WCF.

Spójrz na poniższe pytanie Where to trap failed connection on WCF calling class? i moja odpowiedź na to pytanie. Jest to w zasadzie klasa wrapper, która obsługuje instancję klienta/proxy i wykonuje wiele niezbędnych procedur obsługi błędów, aby przezwyciężyć pewne niedociągnięcia w projektowaniu WCF (więcej informacji w połączonym pytaniu).

Można go napisać ponownie lub zawinąć dalej w innej fabryce, dzięki czemu można buforować właściwości ChannelFactory i klienta/proxy, jeśli obawiasz się o wydajność. "Słyszałem", że jest to zły pomysł na buforowanie ChannelFactory lub klienta/proxy - jednak jestem otwarty na poprawki tutaj.

Powiązane problemy