Sdílet prostřednictvím


RemotingConfiguration.RegisterWellKnownServiceType Metoda

Definice

Zaregistruje objekt Type na konci služby jako dobře známý typ (jedno volání nebo singleton).

Přetížení

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Zaregistruje objekt Type zaznamenaný v zadaném WellKnownServiceTypeEntry na konci služby jako dobře známý typ.

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Zaregistruje objekt Type na konci služby jako dobře známý typ a pomocí zadaných parametrů inicializuje novou instanci objektu WellKnownServiceTypeEntry.

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Zaregistruje objekt Type zaznamenaný v zadaném WellKnownServiceTypeEntry na konci služby jako dobře známý 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

Nastavení konfigurace pro dobře známý typ

Výjimky

Alespoň jeden z volajících, kteří jsou výše v nástroji calltack, nemá oprávnění ke konfiguraci typů a kanálů vzdálené komunikace.

Příklady

#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

Poznámky

Každý klient, který zná identifikátor URI zaregistrovaného dobře známého objektu, může získat proxy pro objekt registrací kanálu, který ChannelServicespreferuje , a aktivací objektu voláním new nebo metodou Activator.GetObject . Chcete-li aktivovat dobře známý objekt pomocí new, musíte nejprve zaregistrovat dobře známý typ objektu v klientovi pomocí RegisterWellKnownClientType metody . RegisterWellKnownClientType Volání metody poskytne infrastruktuře vzdálené komunikace umístění vzdáleného objektu, což umožňuje klíčové slovo new vytvořit ho. Pokud naopak použijete metodu Activator.GetObject k aktivaci dobře známého objektu, musíte mu jako argument zadat adresu URL objektu, takže není nutná žádná předchozí registrace na straně klienta.

Když volání přijde na server, rozhraní .NET Framework extrahuje identifikátor URI ze zprávy, prozkoumá tabulky vzdálené komunikace najít odkaz na objekt, který odpovídá identifikátoru URI, a pak v případě potřeby vytvoří instanci objektu a předá volání metody objektu. Pokud je objekt zaregistrovaný jako SingleCall, je po dokončení volání metody zničen. Pro každou volanou metodu se vytvoří nová instance objektu. Jediným rozdílem mezi Activator.GetObject a new je, že první z nich umožňuje zadat adresu URL jako parametr a druhý získá adresu URL z konfigurace.

Samotný vzdálený objekt není vytvořený procesem registrace. K tomu dochází pouze v případě, že se klient pokusí volat metodu objektu nebo aktivuje objekt ze strany klienta.

Podrobný popis dobře známých objektů najdete v tématu Aktivace serveru.

Viz také

Platí pro

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Zaregistruje objekt Type na konci služby jako dobře známý typ a pomocí zadaných parametrů inicializuje novou instanci objektu 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

Objekt Type.

objectUri
String

Identifikátor URI objektu.

mode
WellKnownObjectMode

Režim aktivace dobře známého typu objektu, který je registrován. (Viz WellKnownObjectMode.)

Výjimky

Alespoň jeden z volajících, kteří jsou výše v nástroji calltack, nemá oprávnění ke konfiguraci typů a kanálů vzdálené komunikace.

Příklady

Následující příklad kódu ukazuje registraci typu objektu na serveru jako dobře známý typ objektu. Kód klienta, který odpovídá uvedenému kódu serveru, najdete v příkladu pro metodu RegisterWellKnownClientType .

#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

Následující příklad kódu ukazuje objekt služby zaregistrovaný v ukázkovém kódu výše.

#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

Poznámky

Každý klient, který zná identifikátor URI zaregistrovaného dobře známého objektu, může získat proxy pro objekt registrací kanálu, který ChannelServicespreferuje , a aktivací objektu voláním new nebo metodou Activator.GetObject . Chcete-li aktivovat dobře známý objekt pomocí new, musíte nejprve zaregistrovat dobře známý typ objektu v klientovi pomocí RegisterWellKnownClientType metody . RegisterWellKnownClientType Volání metody poskytne infrastruktuře vzdálené komunikace umístění vzdáleného objektu, což umožňuje klíčové slovo new vytvořit ho. Pokud naopak použijete metodu Activator.GetObject k aktivaci dobře známého objektu, musíte mu jako argument zadat adresu URL objektu, takže není nutná žádná předchozí registrace na straně klienta.

Když volání přijde na server, rozhraní .NET Framework extrahuje identifikátor URI ze zprávy, prozkoumá tabulky vzdálené komunikace najít odkaz na objekt, který odpovídá identifikátoru URI, a pak v případě potřeby vytvoří instanci objektu a předá volání metody objektu. Pokud je objekt zaregistrovaný jako SingleCall, je po dokončení volání metody zničen. Pro každou volanou metodu se vytvoří nová instance objektu. Jediným rozdílem mezi Activator.GetObject a new je, že první z nich umožňuje zadat adresu URL jako parametr a druhý získá adresu URL z konfigurace.

Samotný vzdálený objekt není vytvořený procesem registrace. K tomu dochází pouze v případě, že se klient pokusí volat metodu objektu nebo aktivuje objekt ze strany klienta.

Podrobný popis dobře známých objektů najdete v tématu Aktivace serveru.

Viz také

Platí pro