RemotingConfiguration.RegisterWellKnownServiceType Methode

Definition

Registriert auf der Dienstseite einen Objekt-Type als bekannten Typ (Einzelaufruf oder Singleton).

Überlädt

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Registriert einen im angegebenen Type erfassten Objekt-WellKnownServiceTypeEntry auf der Dienstseite als bekannten Typ.

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Registriert auf der Dienstseite einen Objekt-Type als bekannten Typ und verwendet die angegebenen Parameter zum Initialisieren einer neuen Instanz von WellKnownServiceTypeEntry.

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Registriert einen im angegebenen Type erfassten Objekt-WellKnownServiceTypeEntry auf der Dienstseite als bekannten 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)

Parameter

entry
WellKnownServiceTypeEntry

Konfigurationseinstellungen für den bekannten Typ.

Ausnahmen

Mindestens einer der Aufrufer an höherer Position im Aufrufstapel verfügt nicht über die Berechtigung zum Konfigurieren von Remotetypen und Channels.

Beispiele

#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

Hinweise

Jeder Client, der den URI eines registrierten bekannten Objekts kennt, kann einen Proxy für das Objekt abrufen, indem er den bevorzugten Kanal mit ChannelServicesregistriert und das Objekt durch Aufrufen new oder der Activator.GetObject -Methode aktiviert. Um ein bekanntes Objekt mit newzu aktivieren, müssen Sie zuerst den bekannten Objekttyp auf dem Client mit der RegisterWellKnownClientType -Methode registrieren. Wenn Sie die RegisterWellKnownClientType -Methode aufrufen, erhält die Remotinginfrastruktur den Speicherort des Remoteobjekts, sodass der new Schlüsselwort (keyword) es erstellen kann. Wenn Sie dagegen die Activator.GetObject -Methode verwenden, um das bekannte Objekt zu aktivieren, müssen Sie es mit der URL des Objekts als Argument angeben, sodass keine vorherige Registrierung auf clientseitiger Seite erforderlich ist.

Wenn der Aufruf auf dem Server eingeht, extrahiert die .NET Framework den URI aus der Nachricht, untersucht die Remotingtabellen, um den Verweis für das Objekt zu suchen, das dem URI entspricht, und instanziiert dann das Objekt, falls erforderlich, und leitet den Methodenaufruf an das Objekt weiter. Wenn das Objekt als SingleCallregistriert ist, wird es nach Abschluss des Methodenaufrufs zerstört. Für jede aufgerufene Methode wird eine neue instance des -Objekts erstellt. Der einzige Unterschied zwischen Activator.GetObject und new besteht darin, dass Sie mit ersterem eine URL als Parameter angeben können, und letztere ruft die URL aus der Konfiguration ab.

Das Remoteobjekt selbst wird nicht durch den Registrierungsprozess instanziiert. Dies geschieht nur, wenn ein Client versucht, eine Methode für das Objekt aufzurufen oder das Objekt von der Clientseite aus zu aktivieren.

Eine ausführliche Beschreibung bekannter Objekte finden Sie unter Serveraktivierung.

Weitere Informationen

Gilt für:

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Registriert auf der Dienstseite einen Objekt-Type als bekannten Typ und verwendet die angegebenen Parameter zum Initialisieren einer neuen Instanz von 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)

Parameter

type
Type

Der Objekt-Type.

objectUri
String

Der URI des Objekts.

mode
WellKnownObjectMode

Der Aktivierungsmodus des bekannten Objekttyps, der gerade registriert wird. (Siehe WellKnownObjectMode.)

Ausnahmen

Mindestens einer der Aufrufer an höherer Position im Aufrufstapel verfügt nicht über die Berechtigung zum Konfigurieren von Remotetypen und Channels.

Beispiele

Im folgenden Codebeispiel wird die Registrierung eines Objekttyps auf dem Server als bekannter Objekttyp veranschaulicht. Den Clientcode, der dem angezeigten Servercode entspricht, finden Sie im Beispiel für die RegisterWellKnownClientType -Methode.

#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

Im folgenden Codebeispiel wird das Dienstobjekt dargestellt, das im obigen Beispielcode registriert ist.

#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

Hinweise

Jeder Client, der den URI eines registrierten bekannten Objekts kennt, kann einen Proxy für das Objekt abrufen, indem er den bevorzugten Kanal mit ChannelServicesregistriert und das Objekt durch Aufrufen new oder der Activator.GetObject -Methode aktiviert. Um ein bekanntes Objekt mit newzu aktivieren, müssen Sie zuerst den bekannten Objekttyp auf dem Client mit der RegisterWellKnownClientType -Methode registrieren. Wenn Sie die RegisterWellKnownClientType -Methode aufrufen, erhält die Remotinginfrastruktur den Speicherort des Remoteobjekts, sodass der new Schlüsselwort (keyword) es erstellen kann. Wenn Sie dagegen die Activator.GetObject -Methode verwenden, um das bekannte Objekt zu aktivieren, müssen Sie es mit der URL des Objekts als Argument angeben, sodass keine vorherige Registrierung auf clientseitiger Seite erforderlich ist.

Wenn der Aufruf auf dem Server eingeht, extrahiert die .NET Framework den URI aus der Nachricht, untersucht die Remotingtabellen, um den Verweis für das Objekt zu suchen, das dem URI entspricht, und instanziiert dann das Objekt, falls erforderlich, und leitet den Methodenaufruf an das Objekt weiter. Wenn das Objekt als SingleCallregistriert ist, wird es nach Abschluss des Methodenaufrufs zerstört. Für jede aufgerufene Methode wird eine neue instance des -Objekts erstellt. Der einzige Unterschied zwischen Activator.GetObject und new besteht darin, dass Sie mit ersterem eine URL als Parameter angeben können, und letztere ruft die URL aus der Konfiguration ab.

Das Remoteobjekt selbst wird nicht durch den Registrierungsprozess instanziiert. Dies geschieht nur, wenn ein Client versucht, eine Methode für das Objekt aufzurufen oder das Objekt von der Clientseite aus zu aktivieren.

Eine ausführliche Beschreibung bekannter Objekte finden Sie unter Serveraktivierung.

Weitere Informationen

Gilt für: