RemotingConfiguration.RegisterWellKnownServiceType Methode

Definitie

Registreert een object Type aan het service-einde als een bekend type (één aanroep of singleton).

Overloads

Name Description
RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Registreert een object Type dat is vastgelegd in het opgegeven WellKnownServiceTypeEntry service-einde als een bekend type.

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Registreert een object Type aan het service-einde als een bekend type, met behulp van de opgegeven parameters voor het initialiseren van een nieuw exemplaar van WellKnownServiceTypeEntry.

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Registreert een object Type dat is vastgelegd in het opgegeven WellKnownServiceTypeEntry service-einde als een bekend type.

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)

Parameters

entry
WellKnownServiceTypeEntry

Configuratie-instellingen voor het bekende type.

Uitzonderingen

Ten minste één van de bellers hoger in de callstack is niet gemachtigd om externe typen en kanalen te configureren.

Voorbeelden

#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

Opmerkingen

Elke client die de URI van een geregistreerd bekend object kent, kan een proxy voor het object verkrijgen door het kanaal te registreren waarmee ChannelServiceshet object de voorkeur geeft en het object te activeren door aan te roepen new of de Activator.GetObject methode. Als u een bekend object wilt activeren, newmoet u eerst het bekende objecttype op de client registreren met behulp van de RegisterWellKnownClientType methode. Het aanroepen van de RegisterWellKnownClientType methode geeft de externe infrastructuur de locatie van het externe object, waardoor het new trefwoord het kan maken. Als u daarentegen de Activator.GetObject methode gebruikt om het bekende object te activeren, moet u dit opgeven met de URL van het object als argument, zodat er geen voorafgaande registratie op het clienteindeinde nodig is.

Wanneer de aanroep op de server aankomt, extraheert .NET Framework de URI uit het bericht, onderzoekt u de externe tabellen om de verwijzing te vinden voor het object dat overeenkomt met de URI, en instantieert u het object zo nodig door de methode-aanroep door te sturen naar het object. Als het object is geregistreerd als SingleCall, wordt het vernietigd nadat de methodeaanroep is voltooid. Er wordt een nieuw exemplaar van het object gemaakt voor elke methode die wordt aangeroepen. Het enige verschil tussen Activator.GetObject en new is dat u met het vorige een URL als parameter kunt opgeven en dat de laatste de URL verkrijgt uit de configuratie.

Het externe object zelf wordt niet geïnstantieerd door het registratieproces. Dit gebeurt alleen wanneer een client probeert een methode aan te roepen op het object of het object activeert vanaf de clientzijde.

Zie Serveractivering voor een gedetailleerde beschrijving van bekende objecten.

Zie ook

Van toepassing op

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Registreert een object Type aan het service-einde als een bekend type, met behulp van de opgegeven parameters voor het initialiseren van een nieuw exemplaar van 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)

Parameters

type
Type

Het object Type.

objectUri
String

De object-URI.

mode
WellKnownObjectMode

De activeringsmodus van het bekende objecttype dat wordt geregistreerd. (Zie WellKnownObjectMode.)

Uitzonderingen

Ten minste één van de bellers hoger in de callstack is niet gemachtigd om externe typen en kanalen te configureren.

Voorbeelden

In het volgende codevoorbeeld ziet u de registratie van een objecttype op de server als een bekend objecttype. Zie het voorbeeld voor de methode voor de clientcode die overeenkomt met de RegisterWellKnownClientType gepresenteerde servercode.

#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

In het volgende codevoorbeeld ziet u het serviceobject dat is geregistreerd in de bovenstaande voorbeeldcode.

#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

Opmerkingen

Elke client die de URI van een geregistreerd bekend object kent, kan een proxy voor het object verkrijgen door het kanaal te registreren waarmee ChannelServiceshet object de voorkeur geeft en het object te activeren door aan te roepen new of de Activator.GetObject methode. Als u een bekend object wilt activeren, newmoet u eerst het bekende objecttype op de client registreren met behulp van de RegisterWellKnownClientType methode. Het aanroepen van de RegisterWellKnownClientType methode geeft de externe infrastructuur de locatie van het externe object, waardoor het new trefwoord het kan maken. Als u daarentegen de Activator.GetObject methode gebruikt om het bekende object te activeren, moet u dit opgeven met de URL van het object als argument, zodat er geen voorafgaande registratie op het clienteindeinde nodig is.

Wanneer de aanroep op de server aankomt, extraheert .NET Framework de URI uit het bericht, onderzoekt u de externe tabellen om de verwijzing te vinden voor het object dat overeenkomt met de URI, en instantieert u het object zo nodig door de methode-aanroep door te sturen naar het object. Als het object is geregistreerd als SingleCall, wordt het vernietigd nadat de methodeaanroep is voltooid. Er wordt een nieuw exemplaar van het object gemaakt voor elke methode die wordt aangeroepen. Het enige verschil tussen Activator.GetObject en new is dat u met het vorige een URL als parameter kunt opgeven en dat de laatste de URL verkrijgt uit de configuratie.

Het externe object zelf wordt niet geïnstantieerd door het registratieproces. Dit gebeurt alleen wanneer een client probeert een methode aan te roepen op het object of het object activeert vanaf de clientzijde.

Zie Serveractivering voor een gedetailleerde beschrijving van bekende objecten.

Zie ook

Van toepassing op