2010-03-26 6 views
4

ServiceContract에서 중요한 변경 사항을 도입해야하는 경우, 이전 컨텍스트를 유지하고 새 컨텍스트를 작성하고 네임 스페이스에서 일부 버전 식별자를 사용하는 것이 가장 좋습니다. 나는이 상황을 제대로 이해한다면동일한 WCF 서비스에서 여러 버전의 ServiceContracts를 명명하는 방법은 무엇입니까?

, 나는 다음을 수행 할 수 있어야한다 :이

[ServiceContract(Namespace = "http://foo.com/2010/01/14")] 
public interface IVersionedService 
{ 
    [OperationContract] 
    string WriteGreeting(Person person); 
} 

[ServiceContract(Name = "IVersionedService", Namespace = "http://foo.com/2010/02/21")] 
public interface IVersionedService2 
{ 
    [OperationContract(Name = "WriteGreeting")] 
    Greeting WriteGreeting2(Person2 person); 
} 

내가 두 버전을 모두 지원하는 서비스를 만들 수 있습니다. 이것은 실제로 작동하며 soapUI에서 테스트 할 때 잘 보입니다.

그러나 "서비스 참조 추가"를 사용하여 Visual Studio에서 클라이언트를 만들면 VS는 네임 스페이스를 무시하고 단순히 같은 이름의 두 인터페이스를 봅니다. VS를 구분하기 위해 VS는 그 중 하나의 이름에 "1"을 추가합니다. 누군가가 최신 버전 인 볼 수 있도록 나는 프록시

ServiceReference.VersionedServiceClient 

ServiceReference.VersionedService1Client 

전화로 지금은 쉬운 일이 아닙니다 끝.

인터페이스에 다른 이름을 부여해야합니까? 예컨대

IVersionedService1 
IVersionedService2 

또는

IVersionedService/2010/01/14 
IVersionedService/2010/02/21 

이 네임 스페이스의 목적을 패배하지 않습니다?

다른 서비스 클래스에 넣고 각 버전마다 고유 한 URL을 가져야합니까?

답변

4

일반적으로 이전 인터페이스와 새 인터페이스를 동시에 구현하는 서비스 구현은 없습니다. 따라서 새 클라이언트가 새 서비스에 연결되면 새 인터페이스 만 제공되며 모든 서비스가 정상적으로 작동합니다. ,

  • 할 수 있다면 이전에서 새 인터페이스를 도출 : - 당신이 두 인터페이스를 제공 할 수있게해야하는 경우

    , 다음 네이 가능하게하는 약간의 "마법"을 할 필요가 . 이 기능은 새로운 기능을 추가하는 경우에만 작동합니다. 새로운 서비스 구현이 다음 이전 스타일의 인터페이스뿐만 아니라 모두를 구현하는 것이 새로운

    public interface IVersionedService2 : IVersionService1 
    { 
        [OperationContract(Name = "WriteNewGreeting")] 
        Greeting WriteNewGreeting(Person2 person); 
    } 
    

    그래서 서비스 구현이 다음 것 모두 WriteGreeting뿐만 아니라 WriteNewGreeting 방법 - 새로운 클라이언트에 연결할 수 있으며, 이전 클라이언트가 IVersionService1 인터페이스와 "이전"네임 스페이스를 계속 볼 수 있기 때문에 계속해서 서비스를 호출 할 수 있습니다.

  • 이전 서비스에서 새 서비스를 가져 오지 못하면 완전히 새로운 서비스를 만듭니다. , 그리고 그것을 새로운 종점에 노출시킨다. 새로운 주소 또는 포트 이렇게하면 기존 클라이언트는 기존의 잘 알려진 서비스를 계속 호출 할 수 있고 새로운 서비스는 별도의 종점에있는 별도의 서비스로 이동할 수 있으며 모든 것이 적절해야합니다.

+0

감사합니다. 사실 둘 다 구현하기 위해 이전 인터페이스에서 새 인터페이스를 파생시킬 필요는 없습니다.내 서비스 않습니다 공용 클래스 VersionedService : IVersionedService, IVersionedService2 및 잘 작동합니다. 내 질문에 대한 자세한 내용은 이미 버전이 지정된 XML 네임 스페이스를 사용할 때 인터페이스에 증분 된 숫자를 추가해야합니까? 당신의 대답은 내가해야한다고 암시하는 것 같습니다. –

+0

@Tor : 아니요, 꼭 그런 것은 아닙니다. 이전 인터페이스와 새로운 인터페이스가 두 개의 별도 XML 네임 스페이스에 있고 두 개의 별도 엔드 포인트 (두 개의 URL)에 노출되어있는 경우 클라이언트는 항상 한쪽 또는 다른 쪽을 선택하며 명명에 충돌이 없습니다. 생각한다. –

관련 문제