Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das folgende Beispiel veranschaulicht einige der Szenarios für Lebensdauer-Leases. CAOClient.exe registriert einen Sponsor, der (nach Ablauf der ersten Leasezeit) den Lease zu einem anderen Zeitpunkt als dem im Remotetyp angegebenen erneuert. Beachten Sie, dass MyClientSponsor MarshalByRefObject für die Übergabe an den Remotelease-Manager als Verweis erweitert. Würde der Sponsor stattdessen um das SerializableAttribute-Attribut ergänzt, würde er nach Wert übergeben und normal ausgeführt werden, jedoch in der Serveranwendungsdomäne.
Diese Anwendung wird auf einem Einzelcomputer oder über ein Netzwerk ausgeführt. Wenn Sie die Anwendung über ein Netzwerk ausführen möchten, müssen Sie anstelle von "localhost" in der Clientkonfiguration den Namen des Remotecomputers einsetzen.
In diesem Beispiel wird Code in Visual Basic und in C# aufgeführt. RemoteType.cs und CAOClient.cs sind zu Dokumentationszwecken angegeben, werden jedoch nicht durch die angegebenen Befehlszeilen kompiliert.
Vorsicht In der Standardeinstellung führt .NET Remoting keine Authentifizierung und Verschlüsselung aus. Daher empfiehlt es sich, alle erforderlichen Schritte auszuführen, um die Identität von Clients und Servern vor der Remoteinteraktion eindeutig zu ermitteln. Da .NET Remoting-Anwendungen für die Ausführung FullTrust-Berechtigungen erfordern, kann ein unbefugter Client, dem der Zugriff auf Ihren Server gewährt wurde, Code wie mit voller Vertrauenswürdigkeit ausführen. Authentifizieren Sie stets die Endpunkte, und verschlüsseln Sie die Kommunikationsstreams, entweder durch Hosten der Remotetypen in IIS (Internet-Informationsdienste), oder indem Sie für diese Aufgabe ein benutzerdefiniertes Channelempfängerpaar erstellen.
So kompilieren Sie dieses Beispiel
Geben Sie an der Eingabeaufforderung die folgenden Befehle ein:
vbc /t:library RemoteType.vb
csc /r:RemoteType.dll server.cs
vbc /r:RemoteType.dll CAOClientVB.vb
Datei "CAOClient"
//CAOClient.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Lifetime;
public class Client{
public static void Main(string[] Args){
// Loads the configuration file.
RemotingConfiguration.Configure("CAOclient.exe.config");
ClientActivatedType CAObject = new ClientActivatedType();
ILease serverLease = (ILease)RemotingServices.GetLifetimeService(CAObject);
MyClientSponsor sponsor = new MyClientSponsor();
// Note: If you do not pass an initial time, the first request will
// be taken from the LeaseTime settings specified in the
// server.exe.config file.
serverLease.Register(sponsor);
// Calls same method on each object.
Console.WriteLine("Client-activated object: " + CAObject.RemoteMethod());
Console.WriteLine("Press Enter to end the client application domain.");
Console.ReadLine();
}
}
public class MyClientSponsor : MarshalByRefObject, ISponsor{
private DateTime lastRenewal;
public MyClientSponsor(){
lastRenewal = DateTime.Now;
}
public TimeSpan Renewal(ILease lease){
Console.WriteLine("I've been asked to renew the lease.");
Console.WriteLine("Time since last renewal:" + (DateTime.Now - lastRenewal).ToString());
lastRenewal = DateTime.Now;
return TimeSpan.FromSeconds(20);
}
}
' CAOClientVB.vb
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Lifetime
Public Class Client
<MTAThread()> _
Public Shared Sub Main()
' Loads the configuration file.
RemotingConfiguration.Configure("CAOclient.exe.config")
Dim CAObject As ClientActivatedType = New ClientActivatedType()
Dim ServerLease As ILease = CType(RemotingServices.GetLifetimeService(CAObject), ILease)
Dim sponsor As MyClientSponsor = New MyClientSponsor()
' Note: If you do not pass an initial time, the first request will be taken from
' the LeaseTime settings specified in the server.exe.config file.
ServerLease.Register(sponsor)
' Calls same method on each object.
Console.WriteLine("Client-activated object: " & CAObject.RemoteMethod())
Console.WriteLine("Press Enter to end the client application domain.")
Console.ReadLine()
End Sub 'Main
End Class 'Client
Public Class MyClientSponsor
Inherits MarshalByRefObject
Implements ISponsor
Private LastRenewal As DateTime
Public Sub New()
LastRenewal = DateTime.Now
End Sub ' MyClientSponsor
Public Function Renewal(ByVal lease As ILease) As TimeSpan Implements ISponsor.Renewal
Console.WriteLine("I've been asked to renew the lease.")
Dim Latest As DateTime = DateTime.Now
Console.WriteLine("Time since last renewal: " & (Latest.Subtract(LastRenewal)).ToString())
LastRenewal = Latest
Return TimeSpan.FromSeconds(20)
End Function 'Renewal
End Class 'MyClientSponsor
Datei "RemoteType"
'RemoteType.vb
Imports System
Imports System.Runtime.Remoting.Lifetime
Imports System.Security.Principal
Public class ClientActivatedType
Inherits MarshalByRefObject
Public Function RemoteMethod() As String
' Announces to the server that the method has been called.
Console.WriteLine("ClientActivatedType.RemoteMethod called.")
' Reports the client identity name.
Return "RemoteMethod called. " & WindowsIdentity.GetCurrent().Name
End Function 'RemoteMethod
' Overrides the lease settings for this object.
Public Overrides Function InitializeLifetimeService() As Object
Dim lease As ILease = CType(MyBase.InitializeLifetimeService(), ILease)
If lease.CurrentState = LeaseState.Initial Then
' Normally, the initial lease time would be much longer.
' It is shortened here for demonstration purposes.
lease.InitialLeaseTime = TimeSpan.FromSeconds(3)
lease.SponsorshipTimeout = TimeSpan.FromSeconds(10)
lease.RenewOnCallTime = TimeSpan.FromSeconds(2)
End If
Return lease
End Function 'InitializeLifetimeService
End Class 'ClientActivatedType
// RemoteType.cs
using System;
using System.Runtime.Remoting.Lifetime;
using System.Security.Principal;
public class ClientActivatedType : MarshalByRefObject{
// Overrides the lease settings for this object.
public override Object InitializeLifetimeService(){
ILease lease = (ILease)base.InitializeLifetimeService();
// Normally, the initial lease time would be much longer.
// It is shortened here for demonstration purposes.
if (lease.CurrentState == LeaseState.Initial){
lease.InitialLeaseTime = TimeSpan.FromSeconds(3);
lease.SponsorshipTimeout = TimeSpan.FromSeconds(10);
lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
}
return lease;
}
public string RemoteMethod(){
// Announces to the server that the method has been called.
Console.WriteLine("ClientActivatedType.RemoteMethod called.");
// Reports the client identity name.
return "RemoteMethod called. " + WindowsIdentity.GetCurrent().Name;
}
}
Server.cs
using System;
using System.Runtime.Remoting;
public class Server{
public static void Main(string[] Args){
// Loads the configuration file.
RemotingConfiguration.Configure("server.exe.config");
Console.WriteLine("The server is listening. Press Enter to exit....");
Console.ReadLine();
Console.WriteLine("Recycling memory...");
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
Server.exe.config
<configuration>
<system.runtime.remoting>
<application>
<service>
<activated type="ClientActivatedType, RemoteType"/>
</service>
<channels>
<channel port="8080" ref="http"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
CAOclient.exe.config
<configuration>
<system.runtime.remoting>
<application>
<client url="https://localhost:8080">
<activated type="ClientActivatedType, RemoteType"/>
</client>
<channels>
<channel ref="http" port="0">
<serverProviders>
<formatter ref="soap" typeFilterLevel="Full"/>
<formatter ref="binary" typeFilterLevel="Full"/>
</serverProviders>
</channel>
</channels> </application>
</system.runtime.remoting>
</configuration>
Siehe auch
Remotingbeispiele | Aktivierung und Lebensdauer von Objekten