RemotingConfiguration.RegisterWellKnownServiceType Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Регистрирует объект Type в конце службы как известный тип (один вызов или одинарный).
Перегрузки
| Имя | Описание |
|---|---|
| RegisterWellKnownServiceType(WellKnownServiceTypeEntry) |
Регистрирует объект Type , записанный в предоставленном WellKnownServiceTypeEntry в конце службы, как известный тип. |
| RegisterWellKnownServiceType(Type, String, WellKnownObjectMode) |
Регистрирует объект Type в конце службы как известный тип, используя заданные параметры для инициализации нового экземпляра WellKnownServiceTypeEntry. |
RegisterWellKnownServiceType(WellKnownServiceTypeEntry)
Регистрирует объект Type , записанный в предоставленном WellKnownServiceTypeEntry в конце службы, как известный тип.
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)
Параметры
Параметры конфигурации для известного типа.
Исключения
По крайней мере один из вызывающих абонентов в calltack не имеет разрешения на настройку типов и каналов удаленного взаимодействия.
Примеры
#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
Комментарии
Любой клиент, который знает универсальный код ресурса (URI) зарегистрированного известного объекта, может получить прокси-сервер для объекта, зарегистрировав канал, с которым он предпочитает ChannelServices, и активировать объект путем вызова new или Activator.GetObject метода. Чтобы активировать хорошо известный объект, newнеобходимо сначала зарегистрировать известный тип объекта на клиенте RegisterWellKnownClientType с помощью метода.
RegisterWellKnownClientType Вызов метода дает инфраструктуре удаленного взаимодействия расположение удаленного объекта, что позволяет new ключевому слову создать его. Если, с другой стороны, метод используется Activator.GetObject для активации известного объекта, необходимо указать его URL-адрес объекта в качестве аргумента, поэтому предварительная регистрация в конце клиента не требуется.
Когда вызов поступает на сервер, платформа .NET Framework извлекает URI из сообщения, проверяет таблицы удаленного взаимодействия, чтобы найти ссылку на объект, соответствующий URI, а затем создает экземпляр объекта при необходимости, переадресовав вызов метода объекту. Если объект зарегистрирован как SingleCall, он уничтожается после завершения вызова метода. Для каждого вызываемого метода создается новый экземпляр объекта. Единственное различие между Activator.GetObject и new тем, что первый позволяет указать URL-адрес в качестве параметра, а последний получает URL-адрес из конфигурации.
Сам удаленный объект не создается экземпляром процесса регистрации. Это происходит только в том случае, если клиент пытается вызвать метод на объекте или активирует объект со стороны клиента.
См. также раздел
Применяется к
RegisterWellKnownServiceType(Type, String, WellKnownObjectMode)
Регистрирует объект Type в конце службы как известный тип, используя заданные параметры для инициализации нового экземпляра 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)
Параметры
- objectUri
- String
Универсальный код ресурса (URI) объекта.
- mode
- WellKnownObjectMode
Режим активации известного типа объекта, зарегистрированного. (См WellKnownObjectMode. .)
Исключения
По крайней мере один из вызывающих абонентов в calltack не имеет разрешения на настройку типов и каналов удаленного взаимодействия.
Примеры
В следующем примере кода демонстрируется регистрация типа объекта на сервере в качестве известного типа объекта. Клиентский код, соответствующий представленному коду сервера, см. в примере 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
В следующем примере кода показан объект службы, зарегистрированный в приведенном выше примере кода.
#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
Комментарии
Любой клиент, который знает универсальный код ресурса (URI) зарегистрированного известного объекта, может получить прокси-сервер для объекта, зарегистрировав канал, с которым он предпочитает ChannelServices, и активировать объект путем вызова new или Activator.GetObject метода. Чтобы активировать хорошо известный объект, newнеобходимо сначала зарегистрировать известный тип объекта на клиенте RegisterWellKnownClientType с помощью метода.
RegisterWellKnownClientType Вызов метода дает инфраструктуре удаленного взаимодействия расположение удаленного объекта, что позволяет new ключевому слову создать его. Если, с другой стороны, метод используется Activator.GetObject для активации известного объекта, необходимо указать его URL-адрес объекта в качестве аргумента, поэтому предварительная регистрация в конце клиента не требуется.
Когда вызов поступает на сервер, платформа .NET Framework извлекает URI из сообщения, проверяет таблицы удаленного взаимодействия, чтобы найти ссылку на объект, соответствующий URI, а затем создает экземпляр объекта при необходимости, переадресовав вызов метода объекту. Если объект зарегистрирован как SingleCall, он уничтожается после завершения вызова метода. Для каждого вызываемого метода создается новый экземпляр объекта. Единственное различие между Activator.GetObject и new тем, что первый позволяет указать URL-адрес в качестве параметра, а последний получает URL-адрес из конфигурации.
Сам удаленный объект не создается экземпляром процесса регистрации. Это происходит только в том случае, если клиент пытается вызвать метод на объекте или активирует объект со стороны клиента.