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)

Параметры

entry
WellKnownServiceTypeEntry

Параметры конфигурации для хорошо известного типа.

Исключения

По крайней мере у одного из вызывающих операторов, находящихся в верхней части стека вызовов, отсутствует разрешение на настройку типов и каналов удаленного взаимодействия.

Примеры

#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)

Параметры

type
Type

Объект Type.

objectUri
String

URI-объект.

mode
WellKnownObjectMode

Регистрируется режим активации типа хорошо известного объекта. (См. раздел WellKnownObjectMode.)

Исключения

По крайней мере у одного из вызывающих операторов, находящихся в верхней части стека вызовов, отсутствует разрешение на настройку типов и каналов удаленного взаимодействия.

Примеры

В следующем примере кода демонстрируется регистрация типа объекта на сервере в качестве известного типа объекта. Код клиента, соответствующий представленному коду сервера, см. в примере для 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-адрес из конфигурации.

Сам удаленный объект не создается в процессе регистрации. Это происходит только в том случае, если клиент пытается вызвать метод для объекта или активирует объект на стороне клиента.

Подробное описание известных объектов см. в разделе Активация сервера.

См. также раздел

Применяется к