RemotingConfiguration.RegisterWellKnownServiceType Metod

Definition

Registrerar ett objekt Type på tjänstslutet som en välkänd typ (enskilt anrop eller singleton).

Överlagringar

Name Description
RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Registrerar ett objekt Type som registrerats i den angivna WellKnownServiceTypeEntry tjänstdelen som en välkänd typ.

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Registrerar ett objekt Type på tjänstslutet som en välkänd typ med hjälp av de angivna parametrarna för att initiera en ny instans av WellKnownServiceTypeEntry.

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Registrerar ett objekt Type som registrerats i den angivna WellKnownServiceTypeEntry tjänstdelen som en välkänd 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)

Parametrar

entry
WellKnownServiceTypeEntry

Konfigurationsinställningar för den välkända typen.

Undantag

Minst en av anroparna högre i anropsstacken har inte behörighet att konfigurera fjärrkommunikationstyper och kanaler.

Exempel

#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

Kommentarer

Alla klienter som känner till URI:n för ett registrerat välkänt objekt kan hämta en proxy för objektet genom att registrera kanalen som den föredrar med ChannelServicesoch aktivera objektet genom att anropa new eller Activator.GetObject metoden. Om du vill aktivera ett välkänt objekt med newmåste du först registrera den välkända objekttypen på klienten med hjälp av RegisterWellKnownClientType metoden . RegisterWellKnownClientType Att anropa metoden ger fjärrkommunikationsinfrastrukturen platsen för fjärrobjektet, vilket gör att nyckelordet new kan skapa det. Om du däremot använder Activator.GetObject metoden för att aktivera det välkända objektet måste du ange objektets URL som argument, så ingen tidigare registrering i klientdelen krävs.

När anropet kommer till servern extraherar .NET Framework URI:n från meddelandet, undersöker fjärrkommunikationstabellerna för att hitta referensen för det objekt som matchar URI:n och instansierar sedan objektet om det behövs och vidarebefordrar metodanropet till objektet. Om objektet har registrerats som SingleCallförstörs det när metodanropet har slutförts. En ny instans av objektet skapas för varje metod som anropas. Den enda skillnaden mellan Activator.GetObject och new är att den förra låter dig ange en URL som en parameter, och den senare hämtar URL:en från konfigurationen.

Själva fjärrobjektet instansieras inte av registreringsprocessen. Detta inträffar bara när en klient försöker anropa en metod på objektet eller aktiverar objektet från klientsidan.

En detaljerad beskrivning av välkända objekt finns i Serveraktivering.

Se även

Gäller för

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Registrerar ett objekt Type på tjänstslutet som en välkänd typ med hjälp av de angivna parametrarna för att initiera en ny instans av 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)

Parametrar

type
Type

Objektet Type.

objectUri
String

Objektets URI.

mode
WellKnownObjectMode

Aktiveringsläget för den välkända objekttyp som registreras. (Se WellKnownObjectMode.)

Undantag

Minst en av anroparna högre i anropsstacken har inte behörighet att konfigurera fjärrkommunikationstyper och kanaler.

Exempel

I följande kodexempel visas registrering av en objekttyp på servern som en välkänd objekttyp. För klientkoden som motsvarar den presenterade serverkoden, se exemplet för RegisterWellKnownClientType metoden.

#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

I följande kodexempel visas tjänstobjektet som registrerats i exempelkoden ovan.

#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

Kommentarer

Alla klienter som känner till URI:n för ett registrerat välkänt objekt kan hämta en proxy för objektet genom att registrera kanalen som den föredrar med ChannelServicesoch aktivera objektet genom att anropa new eller Activator.GetObject metoden. Om du vill aktivera ett välkänt objekt med newmåste du först registrera den välkända objekttypen på klienten med hjälp av RegisterWellKnownClientType metoden . RegisterWellKnownClientType Att anropa metoden ger fjärrkommunikationsinfrastrukturen platsen för fjärrobjektet, vilket gör att nyckelordet new kan skapa det. Om du däremot använder Activator.GetObject metoden för att aktivera det välkända objektet måste du ange objektets URL som argument, så ingen tidigare registrering i klientdelen krävs.

När anropet kommer till servern extraherar .NET Framework URI:n från meddelandet, undersöker fjärrkommunikationstabellerna för att hitta referensen för det objekt som matchar URI:n och instansierar sedan objektet om det behövs och vidarebefordrar metodanropet till objektet. Om objektet har registrerats som SingleCallförstörs det när metodanropet har slutförts. En ny instans av objektet skapas för varje metod som anropas. Den enda skillnaden mellan Activator.GetObject och new är att den förra låter dig ange en URL som en parameter, och den senare hämtar URL:en från konfigurationen.

Själva fjärrobjektet instansieras inte av registreringsprocessen. Detta inträffar bara när en klient försöker anropa en metod på objektet eller aktiverar objektet från klientsidan.

En detaljerad beskrivning av välkända objekt finns i Serveraktivering.

Se även

Gäller för