Mamy usługę WCF, której używamy w aplikacji internetowej. Klient, którego używamy, został wygenerowany przy użyciu opcji Visual Studio "Dodaj odniesienie do usługi". Ponieważ jest to aplikacja internetowa, a ponieważ jej aplikacja może prowadzić do stosunkowo krótkich sesji, zdecydowaliśmy się utworzyć instancję klienta, gdy użytkownik się zaloguje i będzie go używać przez cały czas trwania sesji, a następnie unieszkodliwić go po zakończeniu sesji.Obsługa stałego klienta WCF wprowadzającego stan błędu
To doprowadza mnie do mojego pytania - staramy się wybrać najlepszy sposób postępowania z kanałem klienta wchodzącym w stan Zakłamany. Po poszukiwaniach wokół niektórych, mamy wymyślić to:
if(client.State = CommuncationState.Faulted)
{
client = new Client();
}
try
{
client.SomeMethod();
}
catch //specific exceptions left out for brevity
{
//logging or whatever we decide to do
throw;
}
To jednak nie działa ze względu na fakt, że, przynajmniej w naszym przypadku, nawet jeśli dana usługa jest w dół klienta pokaże Open
, dopóki nie spróbujesz wykonać połączenia, używając go, a następnie wejdzie w stan Faulted
.
To nas pozostawia do zrobienia czegoś innego. Inną opcją, którą wymyśliliśmy, było:
try
{
client.SomeMethod();
}
catch
{
if(client.State == CommunicationState.Faulted)
{
//we know we're faulted, try it again
client = new Client();
try
{
client.SomeMethod();
}
catch
{
throw;
}
}
//handle other exceptions
}
Ale to pachnie. Oczywiście możemy tego uniknąć, używając nowego klienta i usuwając go dla każdego połączenia. Wydaje się to niepotrzebne, ale jeśli jest to właściwy sposób, to myślę, że to właśnie wybierzemy. Więc jaki jest najlepszy sposób, aby zręcznie obsługiwać ustalanie, czy klient jest w stanie błędu, a następnie coś z tym zrobić? Czy naprawdę powinniśmy po prostu otrzymywać nowego klienta dla każdego połączenia?
Jeszcze jedna rzecz, o której należy pamiętać - instancja klienta i wszystkie te sprawdzenia i obsługa odbywają się w klasie opakowania klienta. Jeśli zrobimy to w sposób, jaki sobie zaplanowaliśmy, jest to oczywiste dla samej aplikacji - wykonywanie połączeń i obsługa wyjątków od nich nie wymaga specjalnego kodu.
Co powoduje, że klient wchodzi w stan błędu? Zawsze mogłem, aby usługa WCF zwracała normalnie awarię, a klient może kontynuować swoją działalność. Czy serwer nie odpowiada, czy coś? – Tridus
W tym przypadku używamy członkostwa ASP.NET, a my natknęliśmy się na niego przez przekroczenie atrybutu "userIsOnlineTimeWindow". Oczywiście w takim przypadku wystarczy przekierowanie użytkownika na stronę logowania, ale staramy się upewnić, że jesteśmy przygotowani na każdą inną sytuację, w której moglibyśmy wejść w stan błędu. – Zannjaminderson