다음을 통해 공유


Remoting의 버전 정보

원격 서비스는 강력한 이름의 어셈블리와 함께 작동하도록 설계되었습니다. 원격 서비스에 강력한 이름을 함께 사용할 때는 다음의 기본 규칙이 적용됩니다.

  • IMethodCallMessage 인터페이스 구현의 TypeName 속성에는 버전이 항상 함께 포함됩니다.

  • IConstructionCallMessage 인터페이스 구현의 ActivationTypeName 속성에는 버전이 항상 함께 포함됩니다.

  • ObjRef 개체에 저장된 TypeInfo 속성에는 버전이 항상 함께 포함됩니다.

  • 원격 서비스의 다른 모든 버전 관리는 사용 중인 포맷터의 includeVersions 속성에 의해 결정됩니다. 기본적으로 BinaryFormatter 개체는 버전 관리 정보를 생성하지만 SoapFormatter 개체는 그렇지 않습니다. 이 속성은 채널을 만들 때 프로그래밍 방식으로 변경하거나 원격 구성 파일을 통해 설정할 수 있습니다.

이 단원에서는 이러한 규칙이 개체 참조에 미치는 영향과 원격 서비스에 일반적으로 사용되는 여러 가지 활성화 모델에 대해 설명합니다.

서버 활성 개체

서버에서는 클라이언트에서 서버 활성 개체(또는 <wellknown> 개체)에 연결할 때 활성화되는 형식 버전을 제어합니다. 서비스를 구성할 때 버전 정보를 제공하지 않은 경우에는 개체를 활성화할 때 최근 버전의 어셈블리가 사용됩니다. 예를 들어, MyHello 버전 1.0.0.0과 MyHello 버전 2.0.0.0이라는 두 개의 어셈블리가 있는 경우 버전 정보가 제공되지 않았으면 잘 알려진 개체는 버전 2 어셈블리를 사용하여 활성화됩니다. 클라이언트를 빌드할 때 참조한 버전과는 상관없이 이 버전이 사용됩니다.

특정 버전의 어셈블리를 사용하도록 서비스를 구성할 수도 있습니다. 예를 들어, 다음 구성 파일에서는 버전 지정 방법을 보여 줍니다. 어셈블리가 전역 어셈블리 캐시에 있는 경우에는 culture 정보와 공개 키를 포함한 모든 형식 정보를 지정해야 합니다. 다음 구성 예에서는 강력한 이름 정보를 생략하고 버전 관리에 대해 중점적으로 다룹니다.

<configuration>
<system.runtime.remoting>
   <application name="RemotingHello">
      <lifetime 
         leaseTime="20ms" 
         sponsorshipTimeOut="20ms"
         renewOnCallTime="20ms" 
      />
      <service>
         <wellknown 
            mode="SingleCall" 
            type="Hello.HelloService,MyHello,Version=1.0.0.0,<strong name omitted>"
            objectUri="HelloService.soap" 
         />
         <activated 
            type="Hello.AddService, MyHello"
         />
      </service>
      <channels>
         <channel 
            port="8000"
            ref="tcp"
         >
         </channel>
      </channels>
   </application>
</system.runtime.remoting>
</configuration>

이 파일에서는 클라이언트에 대한 개체를 만들 때 MyHello 어셈블리의 버전 1.0.0.0을 사용하도록 지정합니다. 끝점에 동일한 개체의 버전이 하나 이상 지정된 경우에는 마지막으로 지정된 버전이 개체를 활성화하는 데 사용됩니다. 동일한 개체의 여러 버전 간에 크게 변경된 내용이 있으면 클라이언트에 부정적인 영향을 줄 수 있습니다. 버전이 변경되면서 메서드 매개 변수가 추가되거나 수정된 경우, 버전 1에 대해 컴파일된 클라이언트를 버전 2에 대해 사용하면 예외가 throw됩니다. 따라서 버전 간에 변경된 내용이 큰 경우에는 개체의 새 버전을 다른 끝점에서 호스팅하는 것이 좋습니다.

클라이언트 활성 개체

클라이언트에서 클라이언트 활성 개체 즉, <activated> 개체를 활성화하는 경우 요청된 개체가 활성화되는 서버로 네트워크 호출이 즉시 보내지고 해당 개체에 대한 개체 참조가 클라이언트에 반환됩니다. 클라이언트에서 개체의 활성화를 지시하므로 활성화되는 개체의 버전도 클라이언트에서 선택합니다. 예를 들어, 클라이언트가 해당 개체의 버전 1에 대해 빌드된 경우 서버에서는 HelloService의 버전 1이 활성화되고, 클라이언트가 버전 2에 대해 빌드된 경우에는 서버에서 HelloService의 버전 2가 활성화됩니다.

서비스를 구성할 때 클라이언트 활성 형식에 대한 버전 번호를 지정할 수는 없습니다. 또한 서버 활성 형식과 클라이언트 활성 형식이 모두 동일한 어셈블리에 있는 경우에도 서버 활성 형식에 대해 제공되는 버전 관리 정보는 클라이언트 활성 개체에 영향을 주지 않습니다.

예를 들어, 동일한 어셈블리에 클라이언트 활성 형식과 서버 활성 형식이 있으며 버전 1에 대해서는 클라이언트1을 빌드하고 버전 2에 대해서는 클라이언트2를 빌드한 경우, 서버 활성 개체에 대해 지정된 버전 정보가 없으면 클라이언트1에서는 서버 활성 개체의 버전 2와 클라이언트 활성 개체의 버전 1을 받습니다. 클라이언트2에서는 잘 알려진 형식과 활성 형식 모두에 대해 버전 2의 개체를 받습니다.

잘 알려진 개체에 대해 버전 1의 어셈블리를 사용하도록 서비스를 구성하면 두 클라이언트에서 모두 잘 잘려진 개체의 버전 1을 받으며, 클라이언트 1에서는 활성 형식의 버전 1을 받고 클라이언트 2에서는 활성 형식의 버전 2를 받습니다.

클라이언트에 대해 활성화되는 버전은 구성할 수 없으며 항상 클라이언트가 빌드된 해당 버전이 사용됩니다.

개체 참조

서버 활성 형식과 클라이언트 활성 형식에 적용되는 동일한 규칙이 개체 참조에도 적용됩니다. 예를 들어, 클라이언트 활성 형식에 대한 프록시가 매개 변수로 한 클라이언트에서 다른 클라이언트로 또는 클라이언트에서 서버로 전달될 때는 해당 개체 참조에 포함된 버전 정보가 함께 전달됩니다. 수신자가 개체 참조에서 생성된 프록시에 대해 메서드를 호출하려고 하면 클라이언트가 빌드된 해당 버전보다 개체 참조에 포함된 버전이 우선합니다. 서버 활성 개체의 경우 서버에서는 사용될 버전을 지정하고 개체 참조를 매개 변수로 받는 모든 클라이언트에서는 서비스를 구성할 때 지정된 버전과 통신합니다. 지정된 버전이 없을 때는 서버에서 최근 버전이 활성화됩니다.

값으로 마샬링되는 개체

MBV(Marshal-By-Value) 개체 즉, 값으로 마샬링되는 개체가 응용 프로그램 도메인 간에 전달될 때 사용되는 포맷터에서는 버전 정보가 포함되어 있는지 여부를 확인합니다. BinaryFormatter 개체에는 항상 버전 정보를 포함시키는 반면 SoapFormatter 개체에서는 버전 정보를 무시합니다. 이 옵션은 두 포맷터 모두에 대해 활성화되거나 비활성화될 수 있습니다. 예를 들어, 구성 파일에 다음 줄이 추가되는 경우 SoapFormatter에서는 개체를 serialize할 때 버전 정보를 추가합니다.

<formatter ref="soap" includeVersions="true" />

참고 항목

개념

원격 응용 프로그램의 구성
클라이언트 활성화
서버 활성화

기타 리소스

.NET Framework Remoting 개요