次の方法で共有


リモート処理の例 : 動的公開

.NET リモート処理では、リモート処理が可能な、サーバー側でアクティブ化される型に関しては、既定のコンストラクタのみがサポートされます。特定のコンストラクタを使用してオブジェクトを生成した後でそのオブジェクトを公開し、その特定のインスタンスの公開を完全に制御するには、プログラムでインスタンスを公開します。

ヒント

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

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

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

    vbc -t:library remote.vb

    vbc -r:System.Runtime.Remoting.dll -r:remote.dll server.vb

    vbc -r:System.Runtime.Remoting.dll -r:remote.dll client.vb

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

リモート処理可能オブジェクトの公開を段階ごとに停止するには、サーバー側のコマンド プロンプトで Enter キーを押し、クライアントを再実行して、各段階でスローされる例外を観察します。このアプリケーションは、1 台のコンピュータ上で、またはネットワーク経由で実行されます。このアプリケーションをネットワーク経由で実行するには、クライアント構成の "localhost" をリモート コンピュータの名前で置き換えます。

remote.vb

Imports System

Public Class ServiceClass
   Inherits MarshalByRefObject

   Private m_starttime As DateTime

   Public Sub New()
      Console.WriteLine("ServiceClass created without constructor. Instance hash is " & Me.GetHashCode().ToString())
      m_starttime = DateTime.Now
   End Sub   

   Overrides Protected Sub Finalize()
      Console.WriteLine("I'm being collected after " & (New TimeSpan(DateTime.Now.Ticks - m_starttime.Ticks)).ToString() & " seconds.")
      MyBase.Finalize()
   End Sub    

   Public Function GetServerTime() As DateTime
      Console.WriteLine("Time requested by a client.")
      Return DateTime.Now
   End Function   

   Public ReadOnly Property InstanceHash() As Integer
      Get
         Return Me.GetHashCode()
      End Get
   End Property 

End Class

Server.vb

Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Http

Public Class ServerProcess
   <MTAThread()> _
   Public Shared Sub Main()

      Dim channel As New HttpChannel(8080)
      ChannelServices.RegisterChannel(channel)

      Dim object1 As New ServiceClass()

      ' Creates the single instance of ServiceClass. All clients
      ' will use this instance.
      Dim ref1 As ObjRef = RemotingServices.Marshal(object1, "object1uri")
      Console.WriteLine("ObjRef.URI: " & ref1.URI)

      Console.WriteLine("Running. Press Enter to end publication.")
      Console.ReadLine()

      ' This unregisters the object from publication, but leaves
      ' the channel listening.
      RemotingServices.Disconnect(object1)
      Console.WriteLine()
      Console.WriteLine("Disconnected the object. Client now receives a RemotingException.")
      Console.WriteLine("Press Enter to unregister the channel.")
      Console.ReadLine()
      ' At this point, the ServerClass object still exists. The server
      ' could republish it.

      ' This unregisters the channel, but leaves the application 
      ' domain running.
      ChannelServices.UnregisterChannel(channel)
      Console.WriteLine("Unregistered the channel. Client now receives a WebException.")
      ' The ServerClass object still exists. The server could
      ' reregister the channel and republish the object.
      Console.WriteLine("The host application domain is still running. Press Enter to stop the process.")
      Console.ReadLine()

      ' The ServiceClass object's Finalize method writes a message to
      ' the console. A single object will almost always succeed in 
      ' running its Finalize method before the Console is finalized;
      ' in a larger application, you could ensure that all objects 
      ' finalize before the application ends by calling the garbage 
      ' collector and waiting.
      GC.Collect()
      GC.WaitForPendingFinalizers()
   End Sub
   
End Class

Client.vb

Imports System 
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Imports System.Runtime.Remoting.Channels.Http

Public Class ClientProcess
   <MTAThread()> _
   Public Shared Sub Main()
      
      Dim channel As New HttpChannel(0)
      ChannelServices.RegisterChannel(channel)

      ' Registers the remote class. (This could be done with a
      ' configuration file instead of a direct call.)
      RemotingConfiguration.RegisterWellKnownClientType(Type.GetType("ServiceClass, remote"), "https://localhost:8080/object1uri")

      ' Instead of creating a new object, this obtains a reference
      ' to the server's single instance of the ServiceClass object.
      Dim object1 As ServiceClass = New ServiceClass()

      Try
         Console.WriteLine("ServerTime: " & object1.GetServerTime())
      Catch ex As Exception
         Console.WriteLine("Exception of type: " & ex.GetType.ToString & " occurred.")
         Console.WriteLine("Details: " & ex.Message)
      End Try

   End Sub     ' Main
End Class   ' ClientProcess

参照

関連項目

RemotingServices.Marshal メソッド
RemotingServices.Disconnect メソッド
ChannelServices.UnregisterChannel メソッド

その他の技術情報

リモート処理の例