WCF Callback-Kanal fehlgeschlagen
Bin ich versucht zu implementieren, um einen reconnect Logik für einen wcf-client. Ich bin mir bewusst, dass Sie haben, um eine neue Kanal nach dem aktuellen channel betrat den fehlerhaften Zustand. Ich Tat dies in einem channel bemängelt event-handler:
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();
}
}
Aber in meinem unit-test bekomme ich noch einen "auf Dem Kommunikationsobjekt "System".ServiceModel.- Kanäle.ServiceChannel, nicht für die Kommunikation verwendet, weil es sich bei den Fehlerhaften Zustand" Ausnahme.
Ist es möglich, dass die callback-Kanal ist immer noch nichts zu beanstanden und wenn ja, wie kann ich ersetzen Sie den callback-Kanal?
- Könntest du angeben, was Ihr unit-test macht, wenn es wird die Ausnahme?
- In meinem unit-test, die ich erstellt einen service-host und ein client-Instanz. Ich registrieren, den client auf den Dienst und dann habe ich den Dienst beenden, indem die Referenz auf null. Danach habe ich 20 Sekunden warten (ich bin mit einem zuverlässigen Sitzung mit einem InactivityTimeoutof 10 Sekunden, so bin ich sicher, die Verbindung ist lossed nach 20 Sekunden) und dann rufe ich die Methode DoSomething() auf dem client. Jetzt habe ich neu den service und erwarten, dass der client neu zu verbinden. In diesem moment bekomme ich die exception.
Du musst angemeldet sein, um einen Kommentar abzugeben.
so weit ich habe erfahren, dass eine WCF-Verbindung muss neu erstellt werden, die auf Fehler - es scheint nicht ein Weg, um erholen es anders. Was, wenn ein Fehler Auftritt, wird die Methode scheint, um das Feuer in Ordnung, aber oft sind es Brände und reinigt die WCF-Verbindung (Einrichtung eines neuen, etc) wie die aktuelle Anforderung wird durch - wodurch diese, zu scheitern - vor allem auf timeouts.
Ein paar Vorschläge:
- Falls timeout Verwandte, verfolgen, das Letzte mal ein Anruf getätigt wurde und eine Konstante mit dem Wert für den timeout. Wenn der WCF-Verbindung gelöscht wurde wegen Inaktivität löschen und neu erstellen vor senden Sie die Anfrage über den Draht.
- Die andere Sache, wie es aussieht, sind nicht neu-hinzufügen des fault handler, was bedeutet, dass der erste Fehler wird behandelt erhalten, aber das zweite mal, Fehler wird Sie Umfallen, ohne einen handler verursachen Sie keine neue angehängt wurde.
Hoffe, das hilft
Haben Sie versucht, zurücksetzen des Kommunikationskanals durch den Aufruf mServiceClient.Abbruch in der Fehlerhaften event-handler?
Edit:
Sehe ich, dass Sie nicht erneut initialisieren, mCallback Objekt in Ihren Wiederherstellungs-code. Möglicherweise müssen Sie zuweisen, um eine neue Instanz.