Udostępnij za pośrednictwem


RemotingConfiguration.RegisterWellKnownServiceType Metoda

Definicja

Rejestruje obiekt Type na końcu usługi jako dobrze znany typ (pojedyncze wywołanie lub singleton).

Przeciążenia

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Rejestruje obiekt Type zarejestrowany w podanym WellKnownServiceTypeEntry na końcu usługi jako dobrze znany typ.

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Rejestruje obiekt Type na końcu usługi jako dobrze znany typ przy użyciu podanych parametrów w celu zainicjowania nowego wystąpienia klasy WellKnownServiceTypeEntry.

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Rejestruje obiekt Type zarejestrowany w podanym WellKnownServiceTypeEntry na końcu usługi jako dobrze znany typ.

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)

Parametry

entry
WellKnownServiceTypeEntry

Ustawienia konfiguracji dobrze znanego typu.

Wyjątki

Co najmniej jeden z wywołujących wyżej w stosie wywołań nie ma uprawnień do konfigurowania typów i kanałów komunikacji telefonicznej.

Przykłady

#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

Uwagi

Każdy klient, który zna identyfikator URI zarejestrowanego dobrze znanego obiektu, może uzyskać serwer proxy dla obiektu przez zarejestrowanie preferowanego kanału ChannelServicesza pomocą polecenia i aktywowanie obiektu przez wywołanie new metody lub metodę Activator.GetObject . Aby aktywować dobrze znany obiekt newza pomocą polecenia , należy najpierw zarejestrować dobrze znany typ obiektu na kliencie przy użyciu RegisterWellKnownClientType metody . RegisterWellKnownClientType Wywołanie metody daje infrastrukturze komunikacji zdalnej lokalizację obiektu zdalnego, dzięki czemu słowo kluczowe może new go utworzyć. Jeśli z drugiej strony używasz Activator.GetObject metody do aktywowania dobrze znanego obiektu, musisz podać go przy użyciu adresu URL obiektu jako argumentu, więc nie jest konieczna wcześniejsza rejestracja na końcu klienta.

Po nadejściu wywołania na serwerze program .NET Framework wyodrębnia identyfikator URI z komunikatu, analizuje tabele komunikacji wirtualnej w celu zlokalizowania odwołania do obiektu zgodnego z identyfikatorem URI, a następnie tworzy wystąpienie obiektu w razie potrzeby, przekazując wywołanie metody do obiektu. Jeśli obiekt jest zarejestrowany jako SingleCall, zostanie zniszczony po zakończeniu wywołania metody. Dla każdej metody jest tworzone nowe wystąpienie obiektu. Jedyną różnicą między Activator.GetObjectnew i jest to, że pierwszy umożliwia określenie adresu URL jako parametru, a drugi uzyskuje adres URL z konfiguracji.

Sam obiekt zdalny nie jest tworzone przez proces rejestracji. Dzieje się tak tylko wtedy, gdy klient próbuje wywołać metodę w obiekcie lub aktywuje obiekt po stronie klienta.

Aby uzyskać szczegółowy opis dobrze znanych obiektów, zobacz Aktywacja serwera.

Zobacz też

Dotyczy

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Rejestruje obiekt Type na końcu usługi jako dobrze znany typ przy użyciu podanych parametrów w celu zainicjowania nowego wystąpienia klasy WellKnownServiceTypeEntry.

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)

Parametry

type
Type

Obiekt Type.

objectUri
String

Identyfikator URI obiektu.

mode
WellKnownObjectMode

Tryb aktywacji dobrze znanego typu obiektu jest rejestrowany. (Zobacz WellKnownObjectMode.)

Wyjątki

Co najmniej jeden z wywołujących wyżej w stosie wywołań nie ma uprawnień do konfigurowania typów i kanałów komunikacji telefonicznej.

Przykłady

Poniższy przykład kodu przedstawia rejestrację typu obiektu na serwerze jako dobrze znanego typu obiektu. Aby uzyskać kod klienta odpowiadający prezentowanemu kodowi serwera, zobacz przykład RegisterWellKnownClientType metody .

#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

Poniższy przykład kodu przedstawia obiekt usługi zarejestrowany w powyższym przykładowym kodzie.

#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

Uwagi

Każdy klient, który zna identyfikator URI zarejestrowanego dobrze znanego obiektu, może uzyskać serwer proxy dla obiektu przez zarejestrowanie preferowanego kanału ChannelServicesza pomocą polecenia i aktywowanie obiektu przez wywołanie new metody lub metodę Activator.GetObject . Aby aktywować dobrze znany obiekt newza pomocą polecenia , należy najpierw zarejestrować dobrze znany typ obiektu na kliencie przy użyciu RegisterWellKnownClientType metody . RegisterWellKnownClientType Wywołanie metody daje infrastrukturze komunikacji zdalnej lokalizację obiektu zdalnego, dzięki czemu słowo kluczowe może new go utworzyć. Jeśli z drugiej strony używasz Activator.GetObject metody do aktywowania dobrze znanego obiektu, musisz podać go przy użyciu adresu URL obiektu jako argumentu, więc nie jest konieczna wcześniejsza rejestracja na końcu klienta.

Po nadejściu wywołania na serwerze program .NET Framework wyodrębnia identyfikator URI z komunikatu, analizuje tabele komunikacji wirtualnej w celu zlokalizowania odwołania do obiektu zgodnego z identyfikatorem URI, a następnie tworzy wystąpienie obiektu w razie potrzeby, przekazując wywołanie metody do obiektu. Jeśli obiekt jest zarejestrowany jako SingleCall, zostanie zniszczony po zakończeniu wywołania metody. Dla każdej metody jest tworzone nowe wystąpienie obiektu. Jedyną różnicą między Activator.GetObjectnew i jest to, że pierwszy umożliwia określenie adresu URL jako parametru, a drugi uzyskuje adres URL z konfiguracji.

Sam obiekt zdalny nie jest tworzone przez proces rejestracji. Dzieje się tak tylko wtedy, gdy klient próbuje wywołać metodę w obiekcie lub aktywuje obiekt po stronie klienta.

Aby uzyskać szczegółowy opis dobrze znanych obiektów, zobacz Aktywacja serwera.

Zobacz też

Dotyczy