Próbuję zaimplementować logikę ponownych połączeń dla klienta wcf. Mam świadomość, że musisz utworzyć nowy kanał po tym, jak bieżący kanał wszedł w stan błędu. Zrobiłem to w kanale zarzucić obsługi zdarzenia:Kanał zwrotny WCF był uszkodzony
internal class ServiceClient : DuplexClientBase, IServiceClient
{
public ServiceClient(ICallback callback, EndpointAddress serviceAddress)
: base(callback, MyUtility.GetServiceBinding("NetTcpBinding"), serviceAddress)
{
// Open the connection.
Open();
}
public void Register(string clientName)
{
// register to service
}
public void DoSomething()
{
// some code
}
}
public class ClientApp
{
private IServiceClient mServiceClient;
private ICallback mCallback;
public ClientApp()
{
mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress"));
mServiceClient.Register();
// register faulted event for the service client
((ICommunicationObject)mServiceClient).Faulted += new EventHandler(ServiceClient_Faulted);
}
void ServiceClient_Faulted(object sender, EventArgs e)
{
// Create new Service Client.
mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress"));
// Register the EI at Cell Controller
mServiceClient.Register();
}
public void DoSomething()
{
mServiceClient.DoSomething();
}
}
Ale w moim badanej jednostki I jeszcze dostać „obiektu komunikacyjnego, System.ServiceModel.Channels.ServiceChannel, nie mogą być używane do komunikacji, ponieważ jest w uszkodzonego "wyjątek stanu".
Czy jest możliwe, że kanał zwrotny nadal jest błędny, a jeśli tak, w jaki sposób mogę zamienić kanał zwrotny?
Czy możesz określić, co robi test twojej jednostki, gdy wyzwala wyjątek? –
W mojej jednostce testowej tworzę host usługi i instancję klienta. Rejestruję klienta w usłudze, a następnie zatrzymuję usługę, ustawiając odwołanie na wartość null. Następnie czekam 20 sekund (używam niezawodnej sesji z czasem nieaktywności wynoszącym 10 sekund, więc jestem pewien, że połączenie zostanie utracone po 20 sekundach), a następnie wywołuję metodę DoSomething() na kliencie. Teraz odtwarzam usługę i oczekuję, że klient ponownie się połączy. W tym momencie otrzymuję wyjątek. – phatoni