2012-10-18 15 views
6

Mam dość dużą "starą" usługę WCF z wieloma różnymi metodami.Zmień limit czasu dla każdej metody WCF lub zadzwoń pod numer

Większość z tych metod jest "normalna", więc powinny odpowiedzieć w mniej niż 10 sekund, ale istnieje kilka metod (8 lub 9), które są długimi procesami, więc uzyskanie odpowiedzi może zająć dużo czasu.

Czas oczekiwania na otrzymanie wiadomości i czas wysłania zostały ustawione na 00:40:00, aby zapewnić, że mają wystarczająco dużo czasu na wykonanie tych procesów.

Problemem jest czasami mamy problemy z połączeniem i „normalne” metody zająć naprawdę dużo czasu do odpoczynku ...

Wszystkie są w tej samej usługi, ponieważ korzystają one naprawdę duży model i chcieli ponownie użyj modelu z usługi w każdym wywołaniu (nie mając usługi PeopleService.User i RobotsService.User ... ponieważ są one tej samej klasy w różnych usługach).

Pierwsze rozwiązanie, które sobie wyobrażam, to wykonanie innej usługi z długimi procesami i krótki czas oczekiwania na normalną usługę ... ale powinienem wprowadzić wiele zmian z powodu użycia modelu ...

Czy jest jakiś sposób ustawić inny limit czasu w każdym połączeniu? Lub według metody serwisowej? Czy mimo to powinienem podzielić się usługą?

Z góry dziękuję !!

+1

ty odtworzenie obiektu proxy dla każdego połączenia? jeśli tak, zobacz ten link, aby znaleźć możliwe rozwiązanie: http://stackoverflow.com/questions/1826392/programically-set-wcf-timeout-in-debug-mode – wal

+0

Nie, nie jestem, mam singleton dla pełnomocnik. – zapico

Odpowiedz

7

Po pierwsze, limit czasu do skonfigurowania w twoim przypadku to OperationTimeout, który pozwala limitu czasu na oczekiwanie na odpowiedź przez usługę przed przekroczeniem limitu czasu. Przed wywołaniem od strony klienta można zmodyfikować limit czasu operacji ..

Aby ustawić OperationTimeout na kanale, można wpisać wielkość liter jako instancję proxy/kanału jako IContextChannel i ustawić OperationTimeout.

Na przykład:

IClientChannel contextChannel = channel as IClientChannel; 
contextChannel.OperationTimeout = TimeSpan.FromMinutes(10); 

HTH, Amit

+0

A jak skonfigurować ten OperationTimeout? Dziękuję za odpowiedź :) – zapico

+1

Zmieniono moją odpowiedź na żądane informacje, okrzyki! – amit

+1

Jak to zrobić w sposób bezpieczny dla wątków w obliczu równoczesnego korzystania z kanału? Ustawienie 'client.InnerChannel.OperationTimeout', a następnie wywołanie usługi z wielu wątków nie działa. Ale wiem, że ustawienie OperationTimeout zostanie odczytane raz na początku operacji, a następnie wartość ta pozostaje stała dla tego wywołania, nawet jeśli zmienisz parametr OperationTimeout kanału. Po prostu nie wiem, gdzie byłoby właściwe miejsce - jeśli takie istnieje - aby działało przez wątki. –

Powiązane problemy