Mam standardową przekazanie błędzie w miejscu w mojej służbie:Jak radzić sobie z błędami WCF o niskim poziomie?
- Mam IErrorHandler podpięty do służby do obsługi nieoczekiwanych błędów podczas wykonywania usługi.
- Mam try/catch bloków we wszystkich moich metod obsługi do obsługi oczekiwanych przypadków.
Istnieją jednak przypadki, w których wyjątki są zgłaszane na serwerze i nie są wywoływane.
Oto przypadek, gdy wyjątek serwer nie jest wysyłany do IErrorHandler:
Ustaw receiveTimout na wiązania do 5 sekund na serwerze.
Na kliencie to zrobić:
.
Service1Client sc = new Service1Client();
ICommunicationObject o = sc as ICommunicationObject;
o.Open(); // open channel
sc.GetData(10); // do a first call
Thread.Sleep(10000); // wait longer than the server receiveTimeout
sc.GetData(10); // Attempt another call: server throws a FaulException
W takim przypadku błąd jest zgłaszany na serwerze, ale nie mogę znaleźć sposobu na jego obsługę (i zaloguj się). Wiem, że błąd jest zgłaszany, ponieważ jeśli dołączę debuggera do procesu serwera i złamie wszystkie wyjątki, debugger się zepsuje.
Znalazłem inne podobne przypadki, w których błędy niskiego poziomu nie zostały przekazane do mojego programu.
Gdzie mogę podłączyć mój kod, aby upewnić się, że mogę obsłużyć WSZYSTKIE wyjątki, które występują na serwerze, zanim zostaną one zwrócone do aplikacji klienckiej? Czy powinienem wdrożyć własny IChannel lub inny interfejs niskiego poziomu?
Dzięki
UPDATE 21 września 2009: Zobacz this wątek na Forum Microsoft WCF. Prawdopodobnie będę musiał zaimplementować własny kanał, jeśli chcę obsłużyć ten typ wyjątku. Zaktualizuję ten wpis, gdy będę mieć więcej informacji.
Powiązanie serwera receiveTimeout nie powinno być tutaj aktywne - wystarczyłoby, gdyby otrzymanie odpowiedzi z wywołania GetData() zajęło więcej niż 5 sekund. Twój klient śpiący przez 10 sekund nie działa. Założenie początkowej usługi testowej i aktualizacja powiązania serwera z ustawieniem receiveTimeout na 5 sekund nie powoduje odtworzenia problemu. Jaka jest usterka w odbiorze u klienta? Podejrzewam niepoprawnie skonfigurowane wiązanie/zachowanie serwera, szczególnie jeśli nie włamujesz się do usługi w twoim kodzie. Włącz debugowanie WCF na kliencie/usłudze i zobacz, co pokazuje. –
Zgodnie z opisem w MSDN, serwer receiveTimeout to maksymalny czas oczekiwania serwera na bezczynny otwarty kanał. W takim przypadku ilość czasu jest większa. Wyjątkiem na kliencie jest wyjątek MessageSecurityException, który ma wewnętrzny wyjątek FautException. Wewnętrzny wyjątek FaultException stwierdza przekroczenie wartości receiveTimeout. – Sylvain
Interesujące. Sądzę, że to może być wskazówka, dlaczego zadziałało na pierwsze połączenie, a nie na drugie. Czy możesz przesłać link do dokumentacji, do której odsyłasz na receiveTimeout? Obawiam się, że moje zrozumienie tej wartości jest błędne. Dokumenty, do których się odwołuję, to http://msdn.microsoft.com/en-us/library/ms731299.aspx, dziękuję! –