다음을 통해 공유


원격 서비스의 버전 정보

원격 서비스는 강력한 이름의 어셈블리 작업을 위해 디자인되었습니다. 원격 서비스에 강력한 이름을 사용하는 경우 다음과 같은 기본 규칙이 적용됩니다.

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

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

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

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

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

서버가 활성화한 개체

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

특정 버전의 어셈블리를 사용하도록 서비스를 구성할 수 있습니다. 예를 들어 다음 구성 파일에서는 버전 지정 방법을 보여 줍니다. 어셈블리가 전역 어셈블리 캐시에 있는 경우 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.0에 대해 컴파일된 클라이언트를 버전 2.0에 사용하면 예외가 throw됩니다. 따라서 버전 간에 주요 변경 내용이 있는 경우 개체의 새 버전을 다른 끝점에서 호스팅하는 것이 좋습니다.

클라이언트가 활성화한 개체

클라이언트에서 클라이언트가 활성화한(즉, <activated>) 개체를 활성화하면 네트워크 호출이 서버로 전송되며, 여기서 요청된 개체가 활성화되고 개체에 대한 개체 참조가 클라이언트로 반환됩니다. 클라이언트에서 개체 활성화를 지정하기 때문에 활성화할 개체의 버전도 선택합니다. 예를 들어 클라이언트가 개체의 버전 1.0에 대해 빌드된 경우 서버에서 HelloService 버전 1.0이 활성화되고 클라이언트가 버전 2.0에 대해 빌드된 경우 서버에서 HelloService 버전 2.0이 활성화됩니다.

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

예를 들어 클라이언트가 활성화한 형식과 서버가 활성화한 형식이 동일한 어셈블리에 있고 버전 1.0에 대해 client1을 빌드하고 버전 2.0에 대해 client2를 빌드합니다. 서버가 활성화한 개체에 대해 버전 정보를 지정하지 않으면 client1은 서버가 활성화한 개체의 버전 2.0과 클라이언트가 활성화한 개체의 버전 1.0을 받습니다. Client2는 잘 알려진 형식과 활성화된 형식에 대해 모두 버전 2.0을 받습니다.

잘 알려진 개체에 대해 어셈블리 버전 1.0을 사용하도록 서비스를 구성하면 두 클라이언트가 모두 잘 알려진 개체의 버전 1.0을 받지만 client1은 활성화된 형식의 버전 1.0을 받고 client2는 활성화된 형식의 버전 2.0을 받습니다.

클라이언트에 대해 활성화된 버전은 구성할 수 없습니다. 클라이언트 빌드 시 사용된 버전이 항상 사용됩니다.

개체 참조

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

값에 의한 마샬링 개체

MBV(값에 의한 마샬링) 개체를 응용 프로그램 도메인 간에 전달하는 경우 사용되는 포맷터에 따라 버전 정보의 포함 여부가 결정됩니다. BinaryFormatter 개체는 항상 버전을 포함하고 SoapFormatter 개체는 버전 정보를 무시합니다. 두 포맷터에 대해 모두 이 옵션을 활성화하거나 비활성화할 수 있습니다. 예를 들어 구성 파일에 다음 줄을 추가하면 SoapFormatter가 개체를 serialize할 때 버전 정보를 추가합니다.

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

참고 항목

개념

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

기타 리소스

.NET Framework Remoting 개요

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.