次の方法で共有


RemotingConfiguration.RegisterWellKnownServiceType メソッド (WellKnownServiceTypeEntry)

既知の型として、サービス エンドで提供される WellKnownServiceTypeEntry に記録されているオブジェクト Type を登録します。

Overloads Public Shared Sub RegisterWellKnownServiceType( _
   ByVal entry As WellKnownServiceTypeEntry _)
[C#]
public static void RegisterWellKnownServiceType(WellKnownServiceTypeEntryentry);
[C++]
public: static void RegisterWellKnownServiceType(WellKnownServiceTypeEntry* entry);
[JScript]
public static function RegisterWellKnownServiceType(
   entry : WellKnownServiceTypeEntry);

パラメータ

  • entry
    既知の型の構成設定。

例外

例外の種類 条件
SecurityException コールスタックの上位にある 1 つ以上の呼び出し元に、リモート処理の型とチャネルを構成するためのアクセス許可がありません。

解説

登録された既知のオブジェクトの URI を知っているすべてのクライアントは、 ChannelServices で優先するチャネルを登録し、New または Activator.GetObject を呼び出してそのオブジェクトをアクティブにすることにより、このオブジェクト用にプロキシを取得できます。New で既知のオブジェクトをアクティブにするには、初めに RegisterWellKnownClientType メソッドを使用して、その既知のオブジェクトの型をクライアント側で登録しておく必要があります。 RegisterWellKnownClientType メソッドを呼び出すと、リモート オブジェクトの場所がリモート処理インフラストラクチャに通知され、New キーワードでオブジェクトを作成できるようになります。一方、 Activator.GetObject メソッドを使用して、既知のオブジェクトをアクティブにする場合は、そのオブジェクトの URL を引数として指定する必要があります。このため、クライアント エンドでの事前の登録は必要ありません。

呼び出しがサーバーに到達すると、.NET Framework がメッセージから URI を抽出し、リモート処理テーブルをチェックしてこの URI に一致するオブジェクトの参照を検索し、必要に応じてそのオブジェクトをインスタンス化して、このメソッドの呼び出しをオブジェクトに転送します。オブジェクトが SingleCall として登録されている場合は、このメソッドの呼び出しが完了した後で、オブジェクトが破棄されます。メソッドが呼び出されるたびに、オブジェクトの新しいインスタンスが作成されます。 Activator.GetObject と New の唯一の相違点は、前者は URL をパラメータとして指定できるのに対して、後者は URL を構成から取得する点です。

リモート オブジェクト自体は、登録処理によってインスタンス化されることはありません。これはクライアントがオブジェクト上のメソッドを呼び出そうとしたり、クライアント側からオブジェクトをアクティブにしたりする場合にだけ発生します。

既知のオブジェクトの詳細については、「 サーバー アクティベーション 」を参照してください。

使用例

 
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Http
Imports System.Runtime.Remoting.Messaging
Imports System.Runtime.Serialization
Imports Microsoft.VisualBasic


' code that drives the example
Public Class ObjRefExample

   Public Overloads Shared Sub Main()
      ChannelServices.RegisterChannel(New HttpChannel(8090))

      RemotingConfiguration.RegisterWellKnownServiceType(New WellKnownServiceTypeEntry(GetType(RemoteObject), "RemoteObject", WellKnownObjectMode.Singleton))

      Dim RObj As RemoteObject = CType(Activator.GetObject(GetType(RemoteObject), "https://localhost:8090/RemoteObject"), RemoteObject)
      Dim LObj As New LocalObject()

      RObj.Method1(LObj)

      Console.WriteLine("Press Return to exit...")

      Console.ReadLine()
   End Sub

End Class


' a simple remote object
Public Class RemoteObject
   Inherits MarshalByRefObject

   Public Sub Method1(ByVal param As LocalObject)
       Console.WriteLine("Invoked: Method1({0})", param)
   End Sub

End Class

[C#] 
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Serialization;


public class ObjRefExample {

   public static void Main() {

      ChannelServices.RegisterChannel(new HttpChannel(8090));

      WellKnownServiceTypeEntry wkste = 
         new WellKnownServiceTypeEntry(typeof(RemoteObject), 
                                       "RemoteObject", 
                                       WellKnownObjectMode.Singleton);
      
      RemotingConfiguration.RegisterWellKnownServiceType( wkste );

      RemoteObject RObj = 
         (RemoteObject)Activator.GetObject(typeof(RemoteObject), 
                                           "https://localhost:8090/RemoteObject");

      LocalObject LObj = new LocalObject();
      
      RObj.Method1( LObj );

      Console.WriteLine("Press Return to exit...");
      Console.ReadLine();
   }
}

 
public class RemoteObject : MarshalByRefObject {

   public void Method1(LocalObject param) {
      Console.WriteLine("Invoked: Method1({0})", param);
   }
}

[C++] 
#using <mscorlib.dll>
#using <system.dll>
#using <system.runtime.remoting.dll>

using namespace System;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Channels;
using namespace System::Runtime::Remoting::Channels::Http;
using namespace System::Runtime::Remoting::Messaging;
using namespace System::Runtime::Serialization;

public __gc class RemoteObject : public MarshalByRefObject 
{
public:
    void Method1(LocalObject* param) 
    {
        Console::WriteLine(S"Invoked: Method1( {0})", param);
    }
};

int main() 
{
    ChannelServices::RegisterChannel(new HttpChannel(8090));

    WellKnownServiceTypeEntry* wkste = new WellKnownServiceTypeEntry(__typeof(RemoteObject), 
        S"RemoteObject", 
        WellKnownObjectMode::Singleton);

    RemotingConfiguration::RegisterWellKnownServiceType(wkste);

    RemoteObject* RObj = 
        dynamic_cast<RemoteObject*>(Activator::GetObject(__typeof(RemoteObject), 
                S"https://localhost:8090/RemoteObject"));

    LocalObject* LObj = new LocalObject();

    RObj->Method1(LObj);

    Console::WriteLine(S"Press Return to exit...");
    Console::ReadLine();
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

.NET Framework セキュリティ:

参照

RemotingConfiguration クラス | RemotingConfiguration メンバ | System.Runtime.Remoting 名前空間 | RemotingConfiguration.RegisterWellKnownServiceType オーバーロードの一覧 | WellKnownServiceTypeEntry | WellKnownClientTypeEntry