4 Stimmen

WCF: Proxy öffnen und schließen - was?

Ich verwalte eine Windows Forms-Anwendung mit WCF und verwende intern Net.TCP. Der Lebenszyklus unserer Verbindungen ist GET/USE/CLOSE.

Wir haben ein Problem mit dem Absturz des Anwendungspools, ohne dass es eine Spur gibt. Wenn ich mir netstat ansehe, kann ich sehen, wann ich in die Anwendung komme, da wir einen Anmeldedienst haben. Doch obwohl wir den Proxy in einer using-Anweisung erstellen, verschwindet die Verbindung in netstat nicht, bis ich die Anwendung physisch schließe.

Ist das richtig? Sollte ich auf dem Client etwas anderes tun, um das Schließen der Verbindung zu erzwingen?

Wenn die Verbindung also offen bleibt, bleibt sie dann für die Dauer des openTimeout Einstellung und wird dann abgerissen?

4voto

Matt Punkte 23047

Microsoft sagt, dass Sie die Verbindung am Ende immer schließen müssen (siehe die ejemplo bei MSDN). Ich habe dabei das folgende Muster gefunden Artikel über die WCF-Entsorgungsabwicklung :

WCFServiceClient c = new WCFServiceClient();

try
{
    c.HelloWorld();
}
catch
{
    // acknowledge the Faulted state and transition to Closed
    c.Abort();

    // handle or throw
    throw;
}
finally
{
    c.Close();
}

Der Artikel besagt, dass Sie vermeiden using da es das WCF-Service-Client-Objekt nicht ordnungsgemäß schließt und entsorgt, sollten Sie es mit einer try ... catch ... finally Block stattdessen wie oben gezeigt - auf diese Weise behandeln Sie Ausnahmen (die abgebrochen und dann erneut ausgelöst oder die Ausnahme behandelt wird) und Sie kümmern sich auch um das endgültige Schließen der Verbindung. Dies ist auch klar in Microsofts WCF-Hinweise zur Fehlerbehebung.

Die c.Close() im finally schadet im Falle einer Ausnahme (fehlerhafter Zustand) nicht, denn wir rufen c.Abort() bevor die Ausnahme erneut ausgelöst wird, so dass die c.Close() bringt in diesem Fall eigentlich nichts. Wenn jedoch keine Ausnahme auftritt, dann c.Close() wird tatsächlich normal ausgeführt und die Verbindung wird wie erwartet geschlossen.

Wenn Ihr WCF-Dienst sich seltsam verhält, gibt es viele (andere) Dinge, die dies verursachen könnten - aquí können Sie einige Hinweise zur Fehlersuche finden.

0voto

Kwal Punkte 1531

Erstens sollten Sie wahrscheinlich nicht mit Ihrem Proxy im Kontext einer using-Anweisung, auch wenn es IDisposable implementiert: http://stevesmithblog.com/blog/idisposable-and-wcf/

Allerdings hängt alles davon ab, wie Sie den Proxy nutzen. Werfen Sie einen Blick auf die Antwort von Marc hier: C#, WCF, Wann wird ein clientseitiger Proxy wiederverwendet?

0voto

marc_s Punkte 701497

Ja, das ist das erwartete Verhalten: Die Net.TCP-Bindung hat eine Transportsitzung auf Protokollebene mit Ihrem Server, was Sie in WCF nicht wirklich kontrollieren können.

Ich kenne keinen Mechanismus in WCF, um diese Sitzung auf Transportebene physisch abzubauen - vielleicht kann man das mit Low-Level-TCP-Aufrufen machen, aber ich hatte noch nie das Bedürfnis, so etwas zu tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X