원격 서비스 예제: 추적 서비스
TrackingServices 클래스는 플러그형 추적 처리기를 사용하여 일반 추적 서비스를 제공합니다. ITrackingHandler 인터페이스의 메서드는 다음과 같은 경우에 호출됩니다.
자세한 내용은 참조 설명서의 TrackingServices 및 ITrackingHandler를 참조하십시오.
주의: |
---|
.NET Framework Remoting에서는 기본적으로 인증 또는 암호화를 수행하지 않습니다. 따라서 원격으로 클라이언트 또는 서버와 상호 작용하기 전에 해당 클라이언트 또는 서버의 ID를 확인하는 데 필요한 모든 단계를 수행하는 것이 좋습니다. .NET Framework Remoting 응용 프로그램이 실행되려면 FullTrust 권한이 필요하기 때문에 인증되지 않은 클라이언트가 서버에 액세스할 수 있도록 허용된 경우에는 클라이언트가 완전히 신뢰된 것처럼 코드를 실행할 수 있습니다. 따라서 원격 형식을 IIS(인터넷 정보 서비스)에 호스팅하거나 이 작업을 수행할 사용자 지정 채널 싱크 쌍을 작성하여 항상 끝점을 인증하고 통신 스트림을 암호화하십시오. |
이 샘플을 컴파일하고 실행하려면
모든 파일을 한 디렉터리에 복사합니다.
명령 프롬프트에서 다음 명령을 입력합니다.
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
이 응용 프로그램은 단일 컴퓨터에서 실행되거나 네트워크에서 실행됩니다. 네트워크를 통해 이 응용 프로그램을 실행하려면 클라이언트 구성의 **"localhost"**를 원격 컴퓨터의 이름으로 바꿉니다.
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());
}
}
}
참고 항목
참조
ITrackingHandler
TrackingServices
기타 리소스
Copyright © 2007 by Microsoft Corporation. All rights reserved.