Behandeln Sie den persistenten WCF-Client, der in einen fehlerhaften Zustand versetzt wird
Wir haben einen WCF-Dienst, die, das wir verbrauchen, aus einer web-app. Der client wir benutzen die generiert wurde, mithilfe von Visual Studio "Add Service Reference" - option. Da es eine web-app, und da die Art der app ist wahrscheinlich dazu führen, dass relativ kurze Sitzungen, haben wir uns entschieden, erstellen Sie eine Instanz des Clients, wenn ein Benutzer sich anmeldet, und halten Sie es für die Dauer der Sitzung, dann behandeln, entsorgen Sie es, wenn Sie die Sitzung durch.
Das bringt mich zu meiner Frage - wir versuchen zu entscheiden, der beste Weg, um behandeln Sie die client-Kanal Eingabe einer Fehlerhaften Zustand. Nachdem die Suche um einiges, wir haben kommen mit diesem:
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;
}
Diese aber nicht funktioniert aufgrund der Tatsache, dass, zumindest in unserem Fall, auch wenn der Dienst down ist, der client zeigt die Open
Zustand, bis Sie tatsächlich versuchen, einen Anruf zu tätigen, verwenden Sie es, an welcher Stelle es dann in den Faulted
Zustand.
Bleibt uns etwas anderes zu tun. Eine weitere option, die wir gekommen sind war:
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
}
Aber, dass Gerüche. Natürlich konnten wir dies vermeiden, indem Sie neue client-und entsorgen es für jeden Anruf. Das scheint unnötig, aber wenn das der richtige Weg ist dann denke ich mal das ist, was wir uns entscheiden. Also, was ist der beste Weg, um ordnungsgemäß zu behandeln die Bestimmung, wenn der client befindet sich in einem fehlerhaften Zustand und dann etwas dagegen tun? Sollten wir wirklich nur immer einen neuen client für jeden Anruf?
Eine andere Sache im Auge zu behalten - die Instanziierung der AUFTRAGGEBER und alle von dieser Prüfung und Behandlung geschieht in einer wrapper-Klasse für den client. Wenn wir dies tun, wie wir es beabsichtigt haben, es ist transparent für den app - selber-machen ruft und die Handhabung von Ausnahmen die von Ihnen erfordert keine speziellen code gibt.
InformationsquelleAutor der Frage Zannjaminderson | 2011-03-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage zu beantworten, du kannst mit der Bemängelt Veranstaltung des ChannelFactory-Eigenschaft wie folgt:
Das sollte es erlauben, Sie zu führen, was Protokollierung/Nachbereitung, die Sie benötigen, zu tun.
Als Allgemeine Empfehlung, sollte man nicht verlassen, den Kanal öffnen für die Dauer der Sitzung, so stellen Sie sicher, schließen Sie den Kanal richtig (Abbruch auf eine Ausnahme), nachdem Sie fertig sind mit ihm.
Auch, wenn möglich ist, sollten Sie NICHT verwenden die Visual Studio-Add Service Reference, oder zumindest die Reinigung der code/config erzeugt. Ich empfehle, dass, wenn Sie einen proxy verwenden möchten Implementierung, erstellen Sie Ihre eigenen durch Ableitung von ClientBaseoder verwenden Sie eine ChannelFactory Umsetzung. Da Sie erwähnen, eine wrapper-Klasse, würde ich empfehlen, dass Sie eine ChannelFactory und Griff die Bemängelt Veranstaltung für Ihr Aufräumen muss.
InformationsquelleAutor der Antwort BrandonZeider
Versuchen, Umgang mit dem .Bemängelt Ereignis auf der client-proxy, zB:
Es auslösen soll, sobald der Kanal-Fehler, so dass Sie eine chance, um es wieder öffnen.
Sollten Sie auch noch wickeln Sie jeden Aufruf einer
client
- Methode in einen try-catch-block, und vielleicht sogar wickeln, dass in einemwhile()
Schleife, die Wiederholungen der Aufruf n-mal, dann meldet sich ein Fehler. EG:In meinem code habe ich so weit gegangen wie zu verwenden
ManualResetEvent
zu blockieren, die while () - Schleife, bis dieclient_Faulted
event-handler hat eine chance hatte, neu zu erstellen dieclient
proxy.InformationsquelleAutor der Antwort Chris Wenham