RemotingConfiguration.RegisterWellKnownServiceType Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
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
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
- 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.