Freigeben über


RemotingConfiguration.RegisterWellKnownServiceType Methode

Definition

Registriert ein Objekt Type am Dienstende als bekannter Typ (einzelner Aufruf oder Singleton).

Überlädt

Name Beschreibung
RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Registriert ein Objekt Type , das am Ende des Diensts als bekannter Typ erfasst WellKnownServiceTypeEntry wird.

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Registriert ein Objekt Type am Dienstende als bekannter Typ, wobei die angegebenen Parameter zum Initialisieren einer neuen Instanz von WellKnownServiceTypeEntry.

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Registriert ein Objekt Type , das am Ende des Diensts als bekannter Typ erfasst WellKnownServiceTypeEntry wird.

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 Anrufer im Callstack verfügt nicht über die Berechtigung zum Konfigurieren von Remotingtypen und Kanälen.

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 gewünschten ChannelServicesKanal registriert und das Objekt durch Aufrufen new oder Die Activator.GetObject Methode aktiviert. Um ein bekanntes Objekt mit newzu aktivieren, müssen Sie zuerst den bekannten Objekttyp auf dem Client mithilfe der RegisterWellKnownClientType Methode registrieren. Durch Aufrufen der RegisterWellKnownClientType Methode erhält die Remotinginfrastruktur den Standort des Remoteobjekts, wodurch das new Schlüsselwort erstellt werden kann. Wenn Sie andererseits die Activator.GetObject Methode verwenden, um das bekannte Objekt zu aktivieren, müssen Sie es als Argument angeben, sodass keine vorherige Registrierung am Clientende erforderlich ist.

Wenn der Aufruf auf dem Server eintrifft, extrahiert das .NET Framework den URI aus der Nachricht, überprüft die Remotingtabellen, um den Verweis für das Objekt zu suchen, das dem URI entspricht, und instanziiert das Objekt bei Bedarf, 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 Instanz des Objekts erstellt. Der einzige Unterschied besteht darin Activator.GetObjectnew , dass sie eine URL als Parameter angeben können, und letztere ruft die URL aus der Konfiguration ab.

Das Remoteobjekt selbst wird nicht vom 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.

Weitere Informationen

Gilt für:

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Registriert ein Objekt Type am Dienstende als bekannter Typ, wobei 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

Das Objekt Type.

objectUri
String

Der Objekt-URI.

mode
WellKnownObjectMode

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

Ausnahmen

Mindestens einer der Anrufer im Callstack verfügt nicht über die Berechtigung zum Konfigurieren von Remotingtypen und Kanälen.

Beispiele

Im folgenden Codebeispiel wird die Registrierung eines Objekttyps auf dem Server als bekannter Objekttyp veranschaulicht. Den Clientcode, der dem dargestellten 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

Das folgende Codebeispiel zeigt das dienstobjekt, 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 gewünschten ChannelServicesKanal registriert und das Objekt durch Aufrufen new oder Die Activator.GetObject Methode aktiviert. Um ein bekanntes Objekt mit newzu aktivieren, müssen Sie zuerst den bekannten Objekttyp auf dem Client mithilfe der RegisterWellKnownClientType Methode registrieren. Durch Aufrufen der RegisterWellKnownClientType Methode erhält die Remotinginfrastruktur den Standort des Remoteobjekts, wodurch das new Schlüsselwort erstellt werden kann. Wenn Sie andererseits die Activator.GetObject Methode verwenden, um das bekannte Objekt zu aktivieren, müssen Sie es als Argument angeben, sodass keine vorherige Registrierung am Clientende erforderlich ist.

Wenn der Aufruf auf dem Server eintrifft, extrahiert das .NET Framework den URI aus der Nachricht, überprüft die Remotingtabellen, um den Verweis für das Objekt zu suchen, das dem URI entspricht, und instanziiert das Objekt bei Bedarf, 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 Instanz des Objekts erstellt. Der einzige Unterschied besteht darin Activator.GetObjectnew , dass sie eine URL als Parameter angeben können, und letztere ruft die URL aus der Konfiguration ab.

Das Remoteobjekt selbst wird nicht vom 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.

Weitere Informationen

Gilt für: