In einem Projekt verwende ich IPC (Inter Process Communication) zur gemeinsamen Benutzung von Objekten eines Windows-Dienstes mit einer Client-Anwendung.
Das funktioniert stets problemlos, wenn die Client-Anwendung das erste Mal startete und die Objekte des Windows-Dienste aufrief. Aber nachdem die Client-Anwendung einige Minuten später neu gestartet wurde (ohne den Dienst neu zu starten), kam es zu einer RemotingException mit dieser seltsamen Fehlermeldung:
Fehler beim Schreiben auf einen IPC-Port. Die Pipe wird gerade geschlossen.
Es hat eine ganze Weile gedauert bis ich das Problem gefunden habe:
Da es für meinen Dienst sehr wichtig ist wirklich nur eine Instanz des Remote-Objektes für die gesamte Lebensdauer des Dienstes zu haben, verwendete ich RemotingServices.Marshal, um ein zuvor instanziiertes Objekt zu registrieren. Jedoch wusste ich nicht, dass bei der Registrierung mit dieser Methode die Objekte standardmäßig nur eine sehr kurze Zeit (eine Minute) gültig bleiben.
Um das zu korrigieren, muss die Methode MarshalByRefObject.InitializeLifetimeService innerhalb des Remote-Server-Objektes wie folgt überschrieben werden:
public override Object InitializeLifetimeService() { ILease lease = (ILease)base.InitializeLifetimeService(); if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = TimeSpan.FromDays(365); lease.SponsorshipTimeout = TimeSpan.FromDays(365); lease.RenewOnCallTime = TimeSpan.FromDays(365); } return lease; }
Und hier dasselbe für Entwickler mit VB .NET:
Public Overrides Function InitializeLifetimeService() As Object Dim lease As ILease = CType(MyBase.InitializeLifetimeService(), ILease) If lease.CurrentState = LeaseState.Initial Then lease.InitialLeaseTime = TimeSpan.FromDays(365) lease.SponsorshipTimeout = TimeSpan.FromDays(365) lease.RenewOnCallTime = TimeSpan.FromDays(365) End If Return lease End Function
OK, 365 Tage sind vielleicht etwas übertrieben, aber so können Sie sicher sein, dass Ihre Remote-Objekte so schnell nicht verfallen werden.
Haben Sie diese Problem selbst auch schon einmal gehabt?
Der Artikel ist auch in English verfügbar.