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

Schreibe einen Kommentar