잊지 않겠습니다.

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 xyzlast Y2K
  • Singletone, SingleCell 과는 관계가 없다.
    • Client에서 상태를 가지고 있기 때문에, 그 상태를 보고 판단이 가능한 객체를 만들어주게 된다.
    • 단일 메소드 호출을 넘어 항상 살아있게 된다 

1. 서버 어셈블리

[Hard Cording]

RemotingConfiguration.RegisterActivatedServiceType(typeof(Object 이름));

 

[Config]

<configuration>
  <system.runtime.remoting>
    <application>
      <service>
        <activated type ="CarGeneralAsm.CarProvider, CarGeneralAsm"/>
      </service>
      <channels>
        <channel ref ="http" port ="32469"/>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

  

  

2. 클라이언트 어셈블리

[Hard Coding]

RemoteConfiguration.GetActivator(ObjectName, URI) <== WKO와 동일

  

[Config]

<configuration>
  <system.runtime.remoting>
    <application>
      <client displayName ="carClient" url ="http://localhost:32469">
        <activated type ="CarGeneralAsm.CarProvider, CarGeneralAsm"/>
      </client>
      <channels>
        <channel ref ="http"/>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

신고
Posted by xyzlast Y2K

MBR Object

.NET Framework 2009.01.07 10:51
  • WKO (well known object)
    • 서버 응용프로그램 도매인에 의해서 수명이 직접 제어된다.
    • Client에서는 잘 알려진 문자열 이름을 통해서 이 원격 형식을 활성화 시켜준다.
    • 반드시 기본 생성자가 필요하다!!
    • 상태 기반 구성을 가진다.
      • singleton
        • 여러 client에서 요청을 받는 원격 형식의 instance를 하나만 생성한다.
        • 여러 client가 동시에 하나의 메소드를 호출하게 된다.
        • CLR에서 각각의 client의 호출을 새로운 Thread에 위치하게 해서 구현한다.(Thread atomic에 대해서 안전하지 못하다. 프로그래머의 책임)
      • singlecelll
        • 하나의 메소드가 호출될 때에만 존재하는 WKO 형식이다.
        • 단일 호출 객체는 언제나 무상태(statless) 객체이기 때문에 동시 접근에 훨씬 유리하다.
    • Method나 Property가 활성화 될 때에 WKO 객체가 생성되고, Method가 호출되게 된다.

object remoteObj = Activator.GetObject(/*잘 알려진 문자열 이름*/); -- WKO 선언, 생성되지는 않음

RemoteMessageObject simpleObj = (RemoteMessageObject) remoteObj;

Console.WriteLine(simpleObj.ReturnMessage()); -- Method가 수행되면서 WKO의 생성

    

  • CAO (client activated object)
    • Client에서 사용자 지정 생성자가 가능하다.
    • Client에서의 응용 프로그램 도매인에 의해서 제어되는 객체가 된다.
    • 기본 생성자 이외의 생성자로 생성 가능하다.
    • 상태를 갖는 객체가 된다. 따라서, Client에서의 전역변수로서의 객체 사용이 가능하다.
    • new 또는 Activator.GetObject로 호출될 때에 생성된다.
    • 시간에 따른 GC가 이루어진다.
    • Client에서의 객체 사용의 범위를 결정한다. 기본으로 5분동안의 Life cycle을 갖는다. 

클라이언트 활성 개체는 해당 개체가 마치 클라이언트에 대해 로컬인 것처럼 호출하는 응용 프로그램 도메인에서 수명을 제어하는 개체입니다. 클라이언트 활성화를 사용하는 경우, 클라이언트에서 서버 개체의 인스턴스를 만들려고 하면 서버에 대한 라운드트립이 발생하며, 서버에서 원격 개체를 만들 때 반환된 개체 참조(ObjRef)를 사용하여 클라이언트 프록시가 만들어집니다. 클라이언트에서 클라이언트 활성 형식의 인스턴스를 만들 때마다 해당 인스턴스는 임대가 만료되고 메모리가 재생될 때까지 해당 특정 클라이언트에서 해당 특정 참조만 서비스합니다. 호출하는 응용 프로그램 도메인에서 원격 형식의 새 인스턴스를 두 개 만드는 경우 각 클라이언트 참조에서는 참조가 반환된 서버 응용 프로그램 도메인에서 특정 인스턴스만 호출합니다.    

COM에서 클라이언트는 개체에 대한 참조를 메모리에 보유합니다. 마지막 클라이언트에서 마지막 참조를 해제하면 해당 개체는 자체를 삭제할 수 있습니다. 클라이언트 활성화를 사용하는 경우 클라이언트에서는 서버 개체의 수명을 동일하게 제어할 수 있지만, 참조를 유지하거나 서버 또는 클라이언트가 계속 존재하는지 확인하기 위해 지속적으로 Ping을 실행해야 하는 복잡함은 없습니다. 대신 클라이언트 활성 개체에서는 수명 임대를 사용하여 해당 개체가 계속 존재할 시간을 결정합니다. 클라이언트에서는 원격 개체를 만들 때 해당 개체가 존재할 기본 시간을 지정할 수 있습니다. 원격 개체는 이 기본 수명 제한에 도달하는 경우 클라이언트에 연결하여 해당 개체가 계속 존재해야 하는지 여부와 계속 존재해야 하는 경우에는 기본 수명을 얼마나 더 늘려야 하는지를 확인합니다. 클라이언트를 현재 사용할 수 없는 경우를 대비해 해당 개체가 가비지 수집되도록 표시되기 전에 서버 개체에서 클라이언트에 연결을 시도하면서 대기해야 하는 기본 시간도 지정됩니다. 클라이언트에서는 서버 응용 프로그램 도메인이 해제될 때까지 원격 개체가 재생되는 것을 효율적으로 방지하기 위해 기본 수명이 무기한으로 설정되도록 요청할 수도 있습니다. 이 클라이언트 활성 개체의 무기한 수명과 서버 활성 개체의 무기한 수명 사이의 차이점은 무기한 서버 활성 개체의 경우 해당 형식에 대한 모든 클라이언트 요청을 처리하는 반면 클라이언트 활성 인스턴스의 경우 해당 클라이언트와 해당 인스턴스를 만든 참조만 처리한다는 점입니다.

신고
Posted by xyzlast Y2K


티스토리 툴바