Remotingbeispiel: Überwachungsdienst
Die TrackingServices-Klasse bietet einen allgemeinen Überwachungsdienst mit austauschbaren Trackinghandlern. Methoden für die ITrackingHandler-Schnittstelle werden in den folgenden Situationen aufgerufen:
Ein ObjRef-Objekt wurde (als Ergebnis einer Marshallingoperation) generiert.
ObjRef wurde (als Ergebnis des Widerrufens einer Marshallingoperation) empfangen.
Ein Objekt wurde getrennt.
Weitere Informationen finden Sie unter TrackingServices und unter ITrackingHandler in der Referenzdokumentation.
Vorsicht: |
---|
.NET Framework-Remoting führt standardmäßig keine Authentifizierung oder Verschlüsselung durch. Daher empfiehlt es sich, vor der Remoteinteraktion mit Clients und Servern alle erforderlichen Schritte zu unternehmen, um die Identität der Clients oder Server sicherzustellen. Da .NET Framework-Remoteanwendungen FullTrust-Berechtigungen zur Ausführung benötigen, könnte ein nicht autorisierter Client Code so ausführen, als ob er voll vertrauenswürdig wäre, wenn dem Client Zugriff auf Ihren Server gewährt würde. Authentifizieren Sie Ihre Endpunkte, und verschlüsseln Sie die Kommunikationsstreams unbedingt, indem Sie Ihre Remotetypen in Internetinformationsdiensten (IIS) hosten oder ein angepasstes Channelempfängerpaar erstellen, das diese Aufgabe übernimmt. |
So kompilieren Sie dieses Beispiel und führen es aus
Kopieren Sie alle Dateien in ein Verzeichnis.
Geben Sie an der Eingabeaufforderung folgende Befehle ein:
vbc /t:library /r:System.Runtime.Remoting.dll TrackingHandler.vb vbc /t:library /r:System.Runtime.Remoting.dll RemoteType.vb vbc /r:RemoteType.dll /r:System.Runtime.Remoting.dll /r:TrackingHandler.dll server.vb vbc /r:RemoteType.dll /r:System.Runtime.Remoting.dll client.vb
csc /t:library /r:System.Runtime.Remoting.dll TrackingHandler.cs
csc /t:library /r:System.Runtime.Remoting.dll RemoteType.cs
csc /r:RemoteType.dll /r:System.Runtime.Remoting.dll /r:TrackingHandler.dll server.cs
csc /r:RemoteType.dll /r:System.Runtime.Remoting.dll client.cs
Diese Anwendung wird auf einem einzelnen Computer oder über ein Netzwerk ausgeführt. Wenn Sie diese Anwendung über ein Netzwerk ausführen möchten, müssen Sie "localhost" in der Clientkonfiguration durch den Namen des Remotecomputers ersetzen.
TrackingHandler
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Services
Public Class TrackingHandler
Implements ITrackingHandler
' Notifies a handler that an object has been marshaled.
Public Sub MarshaledObject(ByVal obj As Object, ByVal objref As System.Runtime.Remoting.ObjRef) Implements System.Runtime.Remoting.Services.ITrackingHandler.MarshaledObject
Console.WriteLine("Tracking: An instance of {0} was marshaled. The instance HashCode is: {1}", _
obj.ToString(), obj.GetHashCode().ToString())
Console.WriteLine("ObjRef dump:")
If (objref.ChannelInfo IsNot Nothing) Then
Console.WriteLine(" -- ChannelInfo: ")
DumpChannelInfo(objref.ChannelInfo)
End If
If (objref.EnvoyInfo IsNot Nothing) Then
Console.WriteLine(" -- EnvoyInfo: " + CType(objref.EnvoyInfo, Object).ToString())
End If
If (objref.TypeInfo IsNot Nothing) Then
Console.WriteLine(" -- TypeInfo: " + CType(objref.TypeInfo, Object).ToString())
Console.WriteLine(" -- " + objref.TypeInfo.TypeName)
End If
If (objref.URI IsNot Nothing) Then
Console.WriteLine(" -- URI: " + objref.URI.ToString())
End If
End Sub
Private Sub DumpChannelInfo(ByVal info As IChannelInfo)
Dim obj As Object
For Each obj In info.ChannelData
If (obj Is GetType(ChannelDataStore)) Then
Dim uri As String
For Each uri In CType(obj, ChannelDataStore).ChannelUris
Console.WriteLine(" -- ChannelUris:" + uri)
Next
End If
Next
End Sub
' Notifies a handler that an object has been unmarshaled.
Public Sub UnmarshaledObject(ByVal obj As Object, ByVal [or] As System.Runtime.Remoting.ObjRef) Implements System.Runtime.Remoting.Services.ITrackingHandler.UnmarshaledObject
Console.WriteLine("Tracking: An instance of {0} was unmarshaled. The instance HashCode is: {1}", obj.ToString(), obj.GetHashCode().ToString())
End Sub
' Notifies a handler that an object has been disconnected.
Public Sub DisconnectedObject(ByVal obj As Object) Implements System.Runtime.Remoting.Services.ITrackingHandler.DisconnectedObject
Console.WriteLine("Tracking: An instance of {0} was disconnected. The instance HashCode is: {1}", obj.ToString(), obj.GetHashCode().ToString())
End Sub
End Class
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Services;
namespace TrackingHandler
{
public class TrackingHandler : ITrackingHandler
{
// Notifies a handler that an object has been marshaled.
public void MarshaledObject(Object obj, ObjRef objref)
{
Console.WriteLine("Tracking: An instance of {0} was marshaled. The instance HashCode is: {1}", obj.ToString(), obj.GetHashCode().ToString());
Console.WriteLine("ObjRef dump:");
if (objref.ChannelInfo != null)
{
Console.WriteLine(" -- ChannelInfo: ");
DumpChannelInfo(objref.ChannelInfo);
}
if (objref.EnvoyInfo != null)
Console.WriteLine(" -- EnvoyInfo: " + objref.EnvoyInfo.ToString());
if (objref.TypeInfo != null)
{
Console.WriteLine(" -- TypeInfo: " + objref.TypeInfo.ToString());
Console.WriteLine(" -- " + objref.TypeInfo.TypeName);
}
if (objref.URI != null)
Console.WriteLine(" -- URI: " + objref.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());
}
}
}
RemoteType
Imports System
Public Class ServiceClass
Inherits MarshalByRefObject
Private starttime As DateTime
Public Sub New()
Console.WriteLine("A ServiceClass has been created.")
starttime = DateTime.Now
End Sub
Protected Overrides Sub Finalize()
Console.WriteLine("ServiceClass being collected after " & (New TimeSpan(DateTime.Now.Ticks - starttime.Ticks)).ToString() & " seconds.")
End Sub
Public Function GetServerTime() As DateTime
Console.WriteLine("Time requested by client")
Return DateTime.Now
End Function
End Class
using System;
namespace RemoteType
{
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;
}
}
}
Server
[Visual Basic]
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Imports System.Runtime.Remoting.Services
Imports TrackingHandler
Public Class Server
Public Shared Sub Main()
Dim channel As TcpChannel = New TcpChannel(8080)
ChannelServices.RegisterChannel(channel, False)
TrackingServices.RegisterTrackingHandler(New TrackingHandler())
Dim service As ServiceClass = New ServiceClass()
Dim obj As ObjRef = RemotingServices.Marshal(service, "TcpService")
Console.WriteLine("Press Enter to unmarshal the object.")
Console.ReadLine()
RemotingServices.Unmarshal(obj)
Console.WriteLine("Press Enter to disconnect the object.")
Console.ReadLine()
RemotingServices.Disconnect(service)
End Sub
End Class
[C#]
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Services;
using TrackingHandler;
using RemoteType;
namespace Server
{
public class Server
{
public static void Main(string[] Args)
{
TcpChannel channel = new TcpChannel(8080);
ChannelServices.RegisterChannel(channel, false);
TrackingServices.RegisterTrackingHandler(new TrackingHandler.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
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Public Class Client
Public Shared Sub Main()
ChannelServices.RegisterChannel(New TcpChannel(), False)
Dim remotetype As WellKnownClientTypeEntry = New WellKnownClientTypeEntry( _
GetType(ServiceClass), _
"tcp://localhost:8080/TcpService")
RemotingConfiguration.RegisterWellKnownClientType(remotetype)
Dim service As ServiceClass = New ServiceClass()
Console.WriteLine("Server time is: " & service.GetServerTime().ToLongTimeString())
End Sub
End Class
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteType;
namespace Client
{
public class ClientProcess
{
public static void Main(string[] Args)
{
ChannelServices.RegisterChannel(new TcpChannel(), false);
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());
}
}
}
Siehe auch
Referenz
ITrackingHandler
TrackingServices
Weitere Ressourcen
Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.