서버 활성화
서버 활성 개체는 서버에서 수명을 직접 제어하는 개체입니다. 서버 응용 프로그램 도메인에서는 클라이언트에서 이러한 개체에 대해 메서드를 호출할 때만 해당 개체를 만들고 클라이언트에서 new(Visual Basic에서는 New()) 또는 Activator.GetObject를 호출할 때는 해당 개체를 만들지 않습니다. 이렇게 하면 인스턴스 생성만을 목적으로 한 네트워크 라운드트립이 줄어듭니다. 클라이언트에서 서버 활성 형식의 인스턴스를 요청할 때는 클라이언트 응용 프로그램 도메인에 프록시만 만들어집니다. 그러나 이는 사용자가 기본 구현을 사용할 때 서버 활성화 형식에 대해 기본 생성자만 사용할 수 있음을 의미하기도 합니다. 인수를 사용하는 특정 생성자를 사용하여 만들어지는 인스턴스의 형식을 게시하려면 클라이언트 활성화를 사용하거나 특정 인스턴스를 동적으로 게시하면 됩니다.
서버 활성화 모드
서버 활성 개체에는 다음과 같은 두 가지 활성화 모드(또는 WellKnownObjectMode 값)가 있습니다. Singleton 및 SingleCall
Singleton 형식은 한 번에 하나 이상의 인스턴스를 가질 수 없습니다. 하나의 인스턴스가 있는 경우 모든 클라이언트 요청은 해당 인스턴스에서 처리됩니다. 인스턴스가 없는 경우에는 서버에서 인스턴스를 만들며 모든 후속 클라이언트 요청은 이 인스턴스에서 처리됩니다. Singleton 형식에는 기본 수명이 연관되어 있지 않으므로 한 번에 하나 이상의 인스턴스를 사용할 수 없는 경우라도 클라이언트에서 항상 원격화할 수 있는 클래스의 동일한 인스턴스에 대한 참조를 받는 것은 아닙니다.
SingleCall 형식은 항상 클라이언트 요청마다 하나의 인스턴스를 가집니다. 다음 메서드 호출은 시스템에서 이전 인스턴스를 아직 재생하지 않은 경우에도 다른 서버 인스턴스에 의해 처리됩니다. SingleCall 형식은 수명 임대 시스템에 관여하지 않습니다.
서버 활성 형식의 인스턴스를 만들기 위해 클라이언트에서는 해당 응용 프로그램을 프로그래밍 방식으로 또는 구성 파일을 사용하여 구성한 다음 new를 호출하거나, Activator.GetObject를 호출할 때 원격 개체의 구성을 전달합니다.
참고
클라이언트측에서는 채널을 등록할 필요가 없을 수도 있습니다. 클라이언트에서 채널을 등록하지 않은 경우 원격 시스템에서는 자동으로 Machine.config 파일에 지정된 기본 채널 중 하나로 채널을 선택하거나 만들어 나가는 요청을 실행합니다. 이러한 클라이언트측의 자동 채널 선택 기능에서는 서버로부터 콜백 함수를 수신하기 위한 채널이 등록되지 않으며, 사용자 지정 채널이 machine.config 파일에 추가되지 않는 한 사용자 지정 채널 구현이 등록되지 않습니다. 이러한 경우에는 사용자가 클라이언트 응용 프로그램 도메인에서 사용할 채널 형식을 등록해야 합니다.
다음 코드 예에서는 Activator.GetObject의 호출 방법을 보여 줍니다. 이 예에서는 TcpChannel이 포트 8080에서 통신하도록 등록되어 있는 것으로 가정합니다. 클라이언트에서 서버 개체가 특정 인터페이스를 구현한다는 것만 아는 경우 사용자는 new(Visual Basic에서는 New)를 사용하여 클래스 인스턴스를 만들 수만 있으므로 Activator.GetObject에 대한 호출을 사용해야 합니다.
Dim MyRemoteClass As RemoteObjectClass = _
CType( _
Activator.GetObject(GetType(RemoteObjectClass), _
"tcp://computername:8080/RemoteObjectUri" ), _
RemoteObjectClass
)
RemoteObjectClass MyRemoteClass = (RemoteObjectClass)Activator.GetObject(
typeof(RemoteObjectClass),
"tcp://computername:8080/RemoteObjectUri "
);
앞의 호출에서 서버에 원격 개체가 만들어지지는 않습니다. 이 호출에서는 원격 개체의 로컬 프록시에 대한 참조만 클라이언트에 반환합니다. 이제 클라이언트에서는 MyRemoteClass
가 마치 원격 개체에 대한 직접 참조인 것처럼 계속 처리할 수 있습니다. 클라이언트에서 메서드 호출 간에 실제로 통신할 때 사용하는 인스턴스는 서버 개체가 Singleton 형식으로 선언되었는지 SingleCall 형식으로 선언되었는지 여부에 따라 달라집니다. 서버 개체의 게시자가 이 정보를 노출하든 노출하지 않든 클라이언트에서는 해당 개체 참조를 정확히 동일한 인스턴스를 가지는 것으로 처리합니다.
Singleton
COM에서 "singleton"이라는 용어는 클라이언트에서 개체에 대한 참조를 가지고 있는 한 해당 개체는 메모리에서 삭제되지 않음을 의미했습니다. 그러나 .NET Remoting에서 Singleton 개체는 해당 개체에 대해 지정된 수명 임대의 영향을 받으므로 클라이언트에서 현재 해당 개체에 대한 참조를 보유하고 있는 경우라도 개체가 재생될 수 있습니다. MarshalByRefObject의 InitializeLifetimeService 메서드가 null 참조(Visual Basic에서는 Nothing)를 반환하도록 재정의하면 첫 번째 형식의 Singleton 개체를 만들 수 있습니다. 이렇게 하면 호스트 응용 프로그램 도메인이 실행되는 동안은 개체를 메모리에 유지할 수 있습니다. 자세한 내용은 수명 임대를 참조하십시오. 원격 구성 파일에서 초기 임대 기간을 구성하면 두 번째 형식의 Singleton 개체를 만들 수 있습니다.
참고 항목
참조
WellKnownObjectMode 열거형
Marshal