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.
Die TrackingServices-Klasse stellt einen allgemeinen Nachverfolgungsdienst mit austauschbaren Trackinghandlern bereit. Methoden für die ITrackingHandler-Schnittstelle werden unter den folgenden Umständen aufgerufen:
- wenn ein ObjRef-Objekt erzeugt wurde (als Ergebnis eines Marshallingvorgangs)
- wenn ObjRef empfangen wurde (als Ergebnis eines Unmarshallingvorgangs)
- wenn ein Objekt getrennt wurde
Weitere Informationen hierzu finden Sie unter "TrackingServices" und ITrackingHandler in der Referenzdokumentation.
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 und führen es aus
Geben Sie an einer Eingabeaufforderung die folgenden Befehle ein:
[C#]
csc /t:library TrackingHandler.cs
csc /r:System.Runtime.Remoting.dll /t:library /out:ServiceClass.dll serviceclass.cs
csc /r:System.Runtime.Remoting.dll /r:ServiceClass.dll client.cs
csc /r:System.Runtime.Remoting.dll /r:TrackingHandler.dll /r:ServiceClass.dll server.cs
Öffnen Sie zwei Eingabeaufforderungen, die auf dasselbe Verzeichnis zeigen. Geben Sie an der einen Eingabeaufforderung server ein und an der anderen client.
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.
TrackingHandler.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Services;
public class TrackingHandler : ITrackingHandler{
// Notifies a handler that an object has been marshaled.
public void MarshaledObject(Object obj, ObjRef or){
Console.WriteLine("Tracking: An instance of {0} was marshaled. The instance HashCode is: {1}", obj.ToString(), obj.GetHashCode().ToString());
Console.WriteLine("ObjRef dump:");
if (or.ChannelInfo != null){
Console.WriteLine(" -- ChannelInfo: ");
DumpChannelInfo(or.ChannelInfo);
}
if (or.EnvoyInfo != null)
Console.WriteLine(" -- EnvoyInfo: " + or.EnvoyInfo.ToString());
if (or.TypeInfo != null){
Console.WriteLine(" -- TypeInfo: " + or.TypeInfo.ToString());
Console.WriteLine(" -- " + or.TypeInfo.TypeName);
}
if (or.URI != null)
Console.WriteLine(" -- URI: " + or.URI.ToString());
}
private void DumpChannelInfo(IChannelInfo info){
foreach(object obj in info.ChannelData){
if(obj is ChannelDataStore){
foreach(string uri in ((ChannelDataStore)obj).ChannelUris)
Console.WriteLine(" -- ChannelUris:" + uri);
}
}
}
// Notifies a handler that an object has been unmarshaled.
public void UnmarshaledObject(Object obj, ObjRef or){
Console.WriteLine("Tracking: An instance of {0} was unmarshaled. The instance HashCode is: {1}", obj.ToString(), obj.GetHashCode().ToString());
}
// Notifies a handler that an object has been disconnected.
public void DisconnectedObject(Object obj){
Console.WriteLine("Tracking: An instance of {0} was disconnected. The instance HashCode is: {1}", obj.ToString(), obj.GetHashCode().ToString());
}
}
Server.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Services;
public class ServerProcess{
public static void Main(string[] Args){
TcpChannel channel = new TcpChannel(8080);
ChannelServices.RegisterChannel(channel);
TrackingServices.RegisterTrackingHandler(new TrackingHandler());
ServiceClass service = new ServiceClass();
ObjRef obj = RemotingServices.Marshal(service,"TcpService");
Console.WriteLine("\r\nPress Enter to unmarshal the object.");
Console.ReadLine();
RemotingServices.Unmarshal(obj);
Console.WriteLine("Press Enter to disconnect the object.");
Console.ReadLine();
RemotingServices.Disconnect(service);
}
}
Client.cs
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
public class ClientProcess{
public static void Main(string[] Args){
ChannelServices.RegisterChannel(new TcpChannel());
WellKnownClientTypeEntry remotetype = new WellKnownClientTypeEntry(typeof(ServiceClass),"tcp://localhost:8080/TcpService");
RemotingConfiguration.RegisterWellKnownClientType(remotetype);
ServiceClass service = new ServiceClass();
Console.WriteLine("Server time is: " + service.GetServerTime().ToLongTimeString());
}
}
ServiceClass.cs
using System;
using System.Diagnostics;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
public class ServiceClass : MarshalByRefObject{
private DateTime starttime;
public ServiceClass(){
Console.WriteLine("A ServiceClass has been created.");
starttime = DateTime.Now;
}
~ServiceClass(){
Console.WriteLine("ServiceClass being collected after " + (new TimeSpan(DateTime.Now.Ticks - starttime.Ticks)).ToString() + " seconds.");
}
public DateTime GetServerTime(){
Console.WriteLine("Time requested by client.");
return DateTime.Now;
}
}