잊지 않겠습니다.

MBR, Singleton 형식에서만 객체의 수명 임대가 이루어진다.

   COM에서 "singleton"이라는 용어는 클라이언트에서 개체에 대한 참조를 가지고 있는 한 해당 개체는 메모리에서 삭제되지 않음을 의미했습니다. 그러나 .NET Remoting에서 Singleton 개체는 해당 개체에 대해 지정된 수명 임대의 영향을 받으므로 클라이언트에서 현재 해당 개체에 대한 참조를 보유하고 있는 경우라도 개체가 재생될 수 있습니다.MarshalByRefObject의 InitializeLifetimeService 메서드가 null 참조(Visual Basic에서는 Nothing)를 반환하도록 재정의하면 첫 번째 형식의 Singleton 개체를 만들 수 있습니다. 이렇게 하면 호스트 응용 프로그램 도메인이 실행되는 동안은 개체를 메모리에 유지할 수 있습니다. 자세한 내용은 수명 임대를 참조하십시오. 원격 구성 파일에서 초기 임대 기간을 구성하면 두 번째 형식의 Singleton 개체를 만들 수 있습니다.

  

MBR, SingelCall 형식에서는 데이터의 수명에 대한 논의가 이루어지지 않는다.

: 객체가 new 또는 Activator에 의해서 생성이 될때, Deep-Copy가 이루어지고, 클라이언트에서는 Copy본을 사용하게 된다.

: 서버는 객체에 대한 참조를 모두 잃어버린다.

Posted by Y2K
,

MBV Object

.NET Framework 2009. 1. 7. 10:55

 MBV(Marshla-By-Value) 개체 즉, 값으로 마샬링되는 개체는 ISerializable을 구현하여 해당 개체의 serialization을 구현하거나 해당 개체를 자동으로 serialize하도록 시스템에 알리는 SerializableAttribute로 데코레이트되어 개체의 serialization 규칙을 선언하지만 MarshalByRefObject를 확장하지는 않습니다. 

원격 시스템에서는 이러한 개체의 전체 복사본을 만들고 이 복사본을 호출하는 응용 프로그램 도메인에 전달합니다. 호출자의 응용 프로그램 도메인에 복사본이 있으면 해당 복사본에 대한 호출은 이 복사본에 대해 직접 수행됩니다. 

또한 인수로 전달되는 MBV 개체도 값으로 전달됩니다.

클래스 인스턴스를 응용 프로그램 또는 컨텍스트 경계를 넘어 값으로 전달하려는 경우, SerializableAttribute 특성을 선언하거나 ISerializable을 구현하는 것 외에는 어떤 작업도 수행할 필요가 없습니다. 

반면 게시된 개체의 크기가 매우 큰 경우 사용량이 많은 네트워크에서 전체 복사본을 전달하는 것은 응용 프로그램에 최선의 선택이 아닐 수도 있습니다. 또한 복사된 개체의 상태에 대한 변경 내용은 원래 응용 프로그램 도메인의 원본 개체에 다시 전달되지 않습니다. 추상적인 수준에서 이 시나리오는 클라이언트 브라우저에 의해 요청되는 정적 HTML 페이지의 시나리오와 유사합니다. 즉, 서버에서는 파일을 복사하고 스트림에 써서 보낸 다음에는 해당 파일에 대해 잊어버립니다. 후속 요청은 단지 다른 복사본에 대한 다른 요청일 뿐입니다.

Posted by Y2K
,
1.서버 어셈블리
  • 원격 객체를 갖는 일반 어셈블리를 호스트한다.

   1) Channel을 등록한다.

       System.Runtime.Remoting.Channels.Http.HttpChannel c = new HttpChannel(9113);

       ChannelServices.RegisterChannel(c);

   2) WKO 형식을 등록한다.

          RemotingConfiguration.RegisterWellKnownServiceType(typeof(Class Type), "알려진 이름", WellKnownObjectMode.Singleton); 

  • config 파일을 이용한 서버 어셈블리의 등록
    • RemotingConfiguration.Config(<<Config파일 네임>>)

<configuration>
 <system.runtime.remoting>
  <application>     
   <service>
    <wellknown mode = "Singleton" <<서버 등록 모드>> type ="SimpleRemotingAsm.RemoteMessageObject, 
    DistrubuteApp" <<Class의 풀 네임, 파일 이름(dll)>>  objectUri="RemoteMessageObject.soap"/> <<Uri>>
   </service>
   <channels>
    <channel ref ="http" port="32469"/>
   </channels>
  </application>
 </system.runtime.remoting>
</configuration>

   

2. 클라이언트 어셈블리

1) Channel의 생성

HttpChannel c = new HttpChannel();

ChannelServices.RegisterChannel(c);

2) 원격 WKO 형식의 Proxy를 가지고 온다.

object remoteObject = Activator.GetObject(typeof(Class Type), "uri");

3) 원격 객체를 사용한다. : SingleCell형식의 경우, 이때에 객체가 생성된다.

  • config 파일을 이용한 클라이언트 어셈블리에서의 Remote 객체 사용

<configuration>
  <system.runtime.remoting>
    <application>
      <client displayName ="SimpleRemoteObjectClient">
        <wellknown
            type ="Class의 FullName, 파일이름"
            url ="fullURI" />
      </client>
      <channels>
        <channel ref ="http"/>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

Posted by Y2K
,