次の方法で共有


リモート処理の例 : 追跡サービス

TrackingServices クラスは、プラグイン可能な追跡ハンドラを使用した汎用の追跡サービスを行うために使用します。ITrackingHandler インターフェイスのメソッドは、次のような状況で呼び出されます。

  • ObjRef オブジェクトが、マーシャリングの結果として生成された場合。

  • ObjRef が、マーシャリング解除の結果として受信された場合。

  • オブジェクトが接続解除された場合。

詳細については、リファレンスの「TrackingServices」および「ITrackingHandler」を参照してください。

注意

.NET Framework リモート処理では、既定では認証または暗号化を行いません。したがって、クライアントやサーバーとリモートで対話する前に、ID の確認に必要な手順をすべて実行することをお勧めします。.NET Framework リモート処理アプリケーションの実行には、FullTrust アクセス許可が必要です。そのため、承認されていないクライアントがサーバー上でのアクセスを許可された場合は、完全な信頼を与えられているものとして、コードを実行できてしまいます。インターネット インフォメーション サービス (IIS : Internet Information Services) でリモート型をホストするか、リモート型をホストするためのカスタム チャネル シンク ペアを構築することによって、常にエンドポイントを認証し、通信ストリームを暗号化してください。

このサンプルをコンパイルして実行するには

  1. コマンド プロンプトで次のコマンドを入力します。

    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

  2. 同じディレクトリを指す 2 つのコマンド プロンプトを開きます。一方のコマンド プロンプトでは、「server」と入力します。もう一方のコマンド プロンプトでは、「client」と入力します。

このアプリケーションは、1 台のコンピュータ上で、またはネットワーク経由で実行されます。このアプリケーションをネットワーク経由で実行するには、クライアント構成の "localhost" をリモート コンピュータの名前で置き換える必要があります。

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;
   }
}

参照

関連項目

ITrackingHandler
TrackingServices

その他の技術情報

リモート処理の例