RemotingConfiguration.RegisterWellKnownServiceType Método

Definição

Regista um objeto Type na extremidade do serviço como um tipo bem conhecido (chamada única ou singleton).

Sobrecargas

Name Description
RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Regista um objeto Type registado no fornecido WellKnownServiceTypeEntry na extremidade do serviço como um tipo bem conhecido.

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Regista um objeto Type na extremidade do serviço como um tipo bem conhecido, usando os parâmetros dados para inicializar uma nova instância de WellKnownServiceTypeEntry.

RegisterWellKnownServiceType(WellKnownServiceTypeEntry)

Regista um objeto Type registado no fornecido WellKnownServiceTypeEntry na extremidade do serviço como um tipo bem conhecido.

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)

Parâmetros

entry
WellKnownServiceTypeEntry

Definições de configuração para o tipo bem conhecido.

Exceções

Pelo menos um dos chamadores mais acima na pilha de chamadas não tem permissão para configurar tipos e canais de remoto.

Exemplos

#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

Observações

Qualquer cliente que conheça o URI de um objeto registado e bem conhecido pode obter um proxy para o objeto registando o canal que prefere com ChannelServices, e ativando o objeto ao chamar new o Activator.GetObject método. Para ativar um objeto bem conhecido com new, deve primeiro registar o tipo de objeto conhecido no cliente usando o RegisterWellKnownClientType método. Chamar o RegisterWellKnownClientType método dá à infraestrutura remota a localização do objeto remoto, o que permite que a new palavra-chave o crie. Se, por outro lado, usar o Activator.GetObject método para ativar o objeto conhecido, deve fornecer-lhe a URL do objeto como argumento, pelo que não é necessário registo prévio do lado do cliente.

Quando a chamada chega ao servidor, o .NET Framework extrai o URI da mensagem, examina as tabelas remotas para localizar a referência do objeto que corresponde ao URI, e depois instancia o objeto, se necessário, encaminhando a chamada ao método para o objeto. Se o objeto for registado como SingleCall, é destruído após a conclusão da chamada ao método. Uma nova instância do objeto é criada para cada método chamado. A única diferença entre Activator.GetObject e new é que o primeiro permite especificar um URL como parâmetro, e o segundo obtém o URL a partir da configuração.

O objeto remoto em si não é instanciado pelo processo de registo. Isto só acontece quando um cliente tenta chamar um método no objeto ou o ativa do lado do cliente.

Para uma descrição detalhada de objetos conhecidos, veja Ativação do Servidor.

Ver também

Aplica-se a

RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)

Regista um objeto Type na extremidade do serviço como um tipo bem conhecido, usando os parâmetros dados para inicializar uma nova instância de 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)

Parâmetros

type
Type

O objeto Type.

objectUri
String

O objeto URI.

mode
WellKnownObjectMode

O modo de ativação do tipo de objeto bem conhecido que está a ser registado. (Ver WellKnownObjectMode.)

Exceções

Pelo menos um dos chamadores mais acima na pilha de chamadas não tem permissão para configurar tipos e canais de remoto.

Exemplos

O seguinte exemplo de código demonstra o registo de um tipo de objeto no servidor como um tipo de objeto bem conhecido. Para o código do cliente que corresponde ao código do servidor apresentado, veja o exemplo do RegisterWellKnownClientType método.

#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

O seguinte exemplo de código mostra o objeto de serviço registado no código de exemplo acima.

#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

Observações

Qualquer cliente que conheça o URI de um objeto registado e bem conhecido pode obter um proxy para o objeto registando o canal que prefere com ChannelServices, e ativando o objeto ao chamar new o Activator.GetObject método. Para ativar um objeto bem conhecido com new, deve primeiro registar o tipo de objeto conhecido no cliente usando o RegisterWellKnownClientType método. Chamar o RegisterWellKnownClientType método dá à infraestrutura remota a localização do objeto remoto, o que permite que a new palavra-chave o crie. Se, por outro lado, usar o Activator.GetObject método para ativar o objeto conhecido, deve fornecer-lhe a URL do objeto como argumento, pelo que não é necessário registo prévio do lado do cliente.

Quando a chamada chega ao servidor, o .NET Framework extrai o URI da mensagem, examina as tabelas remotas para localizar a referência do objeto que corresponde ao URI, e depois instancia o objeto, se necessário, encaminhando a chamada ao método para o objeto. Se o objeto for registado como SingleCall, é destruído após a conclusão da chamada ao método. Uma nova instância do objeto é criada para cada método chamado. A única diferença entre Activator.GetObject e new é que o primeiro permite especificar um URL como parâmetro, e o segundo obtém o URL a partir da configuração.

O objeto remoto em si não é instanciado pelo processo de registo. Isto só acontece quando um cliente tenta chamar um método no objeto ou o ativa do lado do cliente.

Para uma descrição detalhada de objetos conhecidos, veja Ativação do Servidor.

Ver também

Aplica-se a