다음을 통해 공유


원격 서비스 예제: 추적 서비스

TrackingServices 클래스는 플러그형 추적 처리기를 사용하여 일반 추적 서비스를 제공합니다. ITrackingHandler 인터페이스의 메서드는 다음과 같은 경우에 호출됩니다.

  • ObjRef 개체가 마샬링의 결과로 생성된 경우

  • ObjRef가 역 마샬링의 결과로 수신된 경우

  • 개체의 연결이 끊긴 경우

자세한 내용은 참조 설명서의 TrackingServicesITrackingHandler를 참조하십시오.

Caution note주의:

.NET Framework Remoting에서는 기본적으로 인증 또는 암호화를 수행하지 않습니다. 따라서 원격으로 클라이언트 또는 서버와 상호 작용하기 전에 해당 클라이언트 또는 서버의 ID를 확인하는 데 필요한 모든 단계를 수행하는 것이 좋습니다. .NET Framework Remoting 응용 프로그램이 실행되려면 FullTrust 권한이 필요하기 때문에 인증되지 않은 클라이언트가 서버에 액세스할 수 있도록 허용된 경우에는 클라이언트가 완전히 신뢰된 것처럼 코드를 실행할 수 있습니다. 따라서 원격 형식을 IIS(인터넷 정보 서비스)에 호스팅하거나 이 작업을 수행할 사용자 지정 채널 싱크 쌍을 작성하여 항상 끝점을 인증하고 통신 스트림을 암호화하십시오.

이 샘플을 컴파일하고 실행하려면

  1. 모든 파일을 한 디렉터리에 복사합니다.

  2. 명령 프롬프트에서 다음 명령을 입력합니다.

    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

기타 리소스

원격 서비스 예제

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.