RemotingConfiguration.RegisterWellKnownServiceType 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
개체 Type을 잘 알려진 형식(SingleCall 또는 Singleton)으로 서비스 쪽에 등록합니다.
오버로드
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)
매개 변수
잘 알려진 형식에 대한 구성 설정입니다.
예외
호출 스택의 상위 호출자 중 하나 이상에게 원격 형식 및 채널을 구성하기 위한 권한이 없는 경우
예제
#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등록되면 메서드 호출이 완료된 후 제거됩니다. 개체의 새 인스턴스가 호출된 각 메서드에 대해 만들어집니다. 와 new
의 Activator.GetObject 유일한 차이점은 전자에서 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
개체 URL입니다.
- 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등록되면 메서드 호출이 완료된 후 제거됩니다. 개체의 새 인스턴스가 호출된 각 메서드에 대해 만들어집니다. 와 new
의 Activator.GetObject 유일한 차이점은 전자에서 URL을 매개 변수로 지정할 수 있고 후자는 구성에서 URL을 가져온다는 것입니다.
원격 개체 자체는 등록 프로세스에 의해 인스턴스화되지 않습니다. 이 클라이언트 개체에서 메서드를 호출 하려고 할 때 발생 하거나 클라이언트 쪽에서 개체를 활성화 합니다.
잘 알려진 개체에 대한 자세한 설명은 서버 활성화를 참조하세요.
추가 정보
적용 대상
.NET