RemotingConfiguration.RegisterWellKnownServiceType Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
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
- 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.