Share via


RemotingConfiguration.RegisterWellKnownServiceType Metode

Definisi

Mendaftarkan objek Type pada akhir layanan sebagai jenis terkenal (panggilan tunggal atau singleton).

Overload

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Mendaftarkan objek Type yang direkam dalam yang disediakan WellKnownServiceTypeEntry pada akhir layanan sebagai jenis terkenal.

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Mendaftarkan objek Type pada akhir layanan sebagai jenis terkenal, menggunakan parameter yang diberikan untuk menginisialisasi instans WellKnownServiceTypeEntrybaru .

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Mendaftarkan objek Type yang direkam dalam yang disediakan WellKnownServiceTypeEntry pada akhir layanan sebagai jenis terkenal.

public:
 static void RegisterWellKnownServiceType(System::Runtime::Remoting::WellKnownServiceTypeEntry ^ entry);
public static void RegisterWellKnownServiceType (System.Runtime.Remoting.WellKnownServiceTypeEntry entry);
static member RegisterWellKnownServiceType : System.Runtime.Remoting.WellKnownServiceTypeEntry -> unit
Public Shared Sub RegisterWellKnownServiceType (entry As WellKnownServiceTypeEntry)

Parameter

entry
WellKnownServiceTypeEntry

Pengaturan konfigurasi untuk jenis terkenal.

Pengecualian

Setidaknya salah satu penelepon yang lebih tinggi di tumpukan panggilan tidak memiliki izin untuk mengonfigurasi jenis jarak jauh dan saluran.

Contoh

#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 ref class RemoteObject: public MarshalByRefObject
{
public:
   void Method1( LocalObject^ param )
   {
      Console::WriteLine( "Invoked: Method1( {0})", param );
   }
};

int main()
{
   ChannelServices::RegisterChannel( gcnew HttpChannel( 8090 ) );
   WellKnownServiceTypeEntry^ wkste = gcnew WellKnownServiceTypeEntry( RemoteObject::typeid,"RemoteObject",WellKnownObjectMode::Singleton );
   RemotingConfiguration::RegisterWellKnownServiceType( wkste );
   RemoteObject^ RObj = dynamic_cast<RemoteObject^>(Activator::GetObject( RemoteObject::typeid, "http://localhost:8090/RemoteObject" ));
   LocalObject^ LObj = gcnew LocalObject;
   RObj->Method1( LObj );
   Console::WriteLine( "Press Return to exit..." );
   Console::ReadLine();
}
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;
using System.Security.Permissions;

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),
                                           "http://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);
   }
}
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 System.Security.Permissions

' code that drives the example
Public Class ObjRefExample

   <PermissionSet(SecurityAction.LinkDemand)> _
   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), "http://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
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
Public Class RemoteObject
   Inherits MarshalByRefObject

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

End Class

Keterangan

Setiap klien yang mengetahui URI objek terkenal terdaftar dapat memperoleh proksi untuk objek dengan mendaftarkan saluran yang lebih disukainya dengan ChannelServices, dan mengaktifkan objek dengan memanggil new atau Activator.GetObject metode . Untuk mengaktifkan objek terkenal dengan new, Anda harus terlebih dahulu mendaftarkan jenis objek terkenal pada klien menggunakan RegisterWellKnownClientType metode . Memanggil RegisterWellKnownClientType metode memberi infrastruktur jarak jauh lokasi objek jarak jauh, yang memungkinkan new kata kunci untuk membuatnya. Jika, di sisi lain, Anda menggunakan Activator.GetObject metode untuk mengaktifkan objek terkenal, Anda harus menyediakannya dengan URL objek sebagai argumen, jadi tidak ada pendaftaran sebelumnya di ujung klien yang diperlukan.

Ketika panggilan tiba di server, .NET Framework mengekstrak URI dari pesan, memeriksa tabel jarak jauh untuk menemukan referensi untuk objek yang cocok dengan URI, lalu membuat instans objek jika perlu, meneruskan panggilan metode ke objek. Jika objek terdaftar sebagai SingleCall, objek dihancurkan setelah panggilan metode selesai. Instans baru objek dibuat untuk setiap metode yang dipanggil. Satu-satunya perbedaan antara Activator.GetObject dan new adalah bahwa yang pertama memungkinkan Anda menentukan URL sebagai parameter, dan yang terakhir mendapatkan URL dari konfigurasi.

Objek jarak jauh itu sendiri tidak dibuat oleh proses pendaftaran. Ini hanya terjadi ketika klien mencoba memanggil metode pada objek atau mengaktifkan objek dari sisi klien.

Untuk deskripsi terperinci tentang objek terkenal, lihat Aktivasi Server.

Lihat juga

Berlaku untuk

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Mendaftarkan objek Type pada akhir layanan sebagai jenis terkenal, menggunakan parameter yang diberikan untuk menginisialisasi instans WellKnownServiceTypeEntrybaru .

public:
 static void RegisterWellKnownServiceType(Type ^ type, System::String ^ objectUri, System::Runtime::Remoting::WellKnownObjectMode mode);
public static void RegisterWellKnownServiceType (Type type, string objectUri, System.Runtime.Remoting.WellKnownObjectMode mode);
static member RegisterWellKnownServiceType : Type * string * System.Runtime.Remoting.WellKnownObjectMode -> unit
Public Shared Sub RegisterWellKnownServiceType (type As Type, objectUri As String, mode As WellKnownObjectMode)

Parameter

type
Type

Objek Type.

objectUri
String

URI objek.

mode
WellKnownObjectMode

Mode aktivasi dari jenis objek terkenal yang sedang didaftarkan. (Lihat WellKnownObjectMode.)

Pengecualian

Setidaknya salah satu penelepon yang lebih tinggi di tumpukan panggilan tidak memiliki izin untuk mengonfigurasi jenis jarak jauh dan saluran.

Contoh

Contoh kode berikut menunjukkan pendaftaran jenis objek di server sebagai jenis objek terkenal. Untuk kode klien yang sesuai dengan kode server yang disajikan, lihat contoh untuk metode .RegisterWellKnownClientType

#using <system.dll>
#using <system.runtime.remoting.dll>
#using "service.dll"

using namespace System;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Channels;
using namespace System::Runtime::Remoting::Channels::Tcp;
int main()
{
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

public class ServerClass {

    public static void Main()  {
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp


Public Class ServerClass
   
   Public Shared Sub Main()
ChannelServices::RegisterChannel( gcnew TcpChannel( 8082 ) );
RemotingConfiguration::ApplicationName = "HelloServiceApplication";
RemotingConfiguration::RegisterWellKnownServiceType( HelloService::typeid,
                                                     "MyUri",
                                                     WellKnownObjectMode::SingleCall );
ChannelServices.RegisterChannel(new TcpChannel(8082));

RemotingConfiguration.ApplicationName = "HelloServiceApplication";

RemotingConfiguration.RegisterWellKnownServiceType( typeof(HelloService),
                                                    "MyUri",
                                                    WellKnownObjectMode.SingleCall
                                                  );
ChannelServices.RegisterChannel(New TcpChannel(8082))

RemotingConfiguration.ApplicationName = "HelloServiceApplication"

RemotingConfiguration.RegisterWellKnownServiceType(GetType(HelloService), "MyUri", WellKnownObjectMode.SingleCall)
   Console::WriteLine( "Press enter to stop this process." );
   Console::ReadLine();
   return 0;
}

        Console.WriteLine("Press enter to stop this process.");
        Console.ReadLine();
    }
}

      Console.WriteLine("Press enter to stop this process.")
      Console.ReadLine()

   End Sub

End Class

Contoh kode berikut menunjukkan objek layanan yang terdaftar dalam kode sampel di atas.

#using <system.dll>

using namespace System;
public ref class HelloService: public MarshalByRefObject
{
private:
   static int n_instances;

public:
   HelloService()
   {
      n_instances++;
      Console::WriteLine( "" );
      Console::WriteLine( "HelloService activated - instance # {0}.", n_instances );
   }

   ~HelloService()
   {
      Console::WriteLine( "HelloService instance {0} destroyed.", n_instances );
      n_instances--;
   }

   String^ HelloMethod( String^ name )
   {
      Console::WriteLine( "HelloMethod called on HelloService instance {0}.", n_instances );
      return String::Format( "Hi there {0}.", name );
   }

};
using System;

public class HelloService : MarshalByRefObject {

    static int n_instances;

    public HelloService() {
        n_instances++;
        Console.WriteLine("");
        Console.WriteLine("HelloService activated - instance # {0}.", n_instances);
    }

    ~HelloService()  {
        Console.WriteLine("HelloService instance {0} destroyed.", n_instances);
        n_instances--;
    }

    public String HelloMethod(String name)  {

        Console.WriteLine("HelloMethod called on HelloService instance {0}.", n_instances);
        return "Hi there " + name + ".";
    }
}
Public Class HelloService
   Inherits MarshalByRefObject
   
   Private Shared n_instances As Integer
     
   Public Sub New()
      n_instances += 1
      Console.WriteLine("")
      Console.WriteLine("HelloService activated - instance # {0}.", n_instances)
   End Sub
   
   
   Protected Overrides Sub Finalize()
      Console.WriteLine("HelloService instance {0} destroyed.", n_instances)
      n_instances -= 1
      MyBase.Finalize()
   End Sub
   
   
   Public Function HelloMethod(name As [String]) As [String]
      Console.WriteLine("HelloMethod called on HelloService instance {0}.", n_instances)
      Return "Hi there " + name + "."
   End Function 'HelloMethod

End Class

Keterangan

Setiap klien yang mengetahui URI objek terkenal terdaftar dapat memperoleh proksi untuk objek dengan mendaftarkan saluran yang lebih disukainya dengan ChannelServices, dan mengaktifkan objek dengan memanggil new atau Activator.GetObject metode . Untuk mengaktifkan objek terkenal dengan new, Anda harus terlebih dahulu mendaftarkan jenis objek terkenal pada klien menggunakan RegisterWellKnownClientType metode . Memanggil RegisterWellKnownClientType metode memberi infrastruktur jarak jauh lokasi objek jarak jauh, yang memungkinkan new kata kunci untuk membuatnya. Jika, di sisi lain, Anda menggunakan Activator.GetObject metode untuk mengaktifkan objek terkenal, Anda harus menyediakannya dengan URL objek sebagai argumen, jadi tidak ada pendaftaran sebelumnya di ujung klien yang diperlukan.

Ketika panggilan tiba di server, .NET Framework mengekstrak URI dari pesan, memeriksa tabel jarak jauh untuk menemukan referensi untuk objek yang cocok dengan URI, lalu membuat instans objek jika perlu, meneruskan panggilan metode ke objek. Jika objek terdaftar sebagai SingleCall, objek dihancurkan setelah panggilan metode selesai. Instans baru objek dibuat untuk setiap metode yang dipanggil. Satu-satunya perbedaan antara Activator.GetObject dan new adalah bahwa yang pertama memungkinkan Anda menentukan URL sebagai parameter, dan yang terakhir mendapatkan URL dari konfigurasi.

Objek jarak jauh itu sendiri tidak dibuat oleh proses pendaftaran. Ini hanya terjadi ketika klien mencoba memanggil metode pada objek atau mengaktifkan objek dari sisi klien.

Untuk deskripsi terperinci tentang objek terkenal, lihat Aktivasi Server.

Lihat juga

Berlaku untuk