2009-05-29 2 views
8

SOAP 웹 서비스 (ASP.NET 버전 2.0)를 유지 관리하고 있으며 특정 메서드의 반환 값을 수정하는 몇 가지 변경 작업을 수행해야합니다.ASP.NET 2.0 웹 서비스 버전을 변경하는 가장 좋은 방법은 무엇입니까?

기존 구현을 손상시키지 않고 일반적으로 허용되는 방법은 무엇입니까?

나의 초기 생각은 다음과 같은 것이 모두 가능하다는 것입니다.

a) 기존 웹 서비스 내에 새로운 버전 특정 메소드를 제공하십시오. getPerson_v1.4
b) .asmx 파일의 전체 사본에 새로운 버전 번호를 제공하십시오. http : /www.example.com/AdminWS_V1_4.asmx. 이것은 서비스가 50 가지가 넘는 메소드를 가지고 있고 2/3 메소드의 변경을 위해 그 코드를 복사하는 것이 너무 많은 중복 된 코드처럼 보이기 때문에 내가 좋아하는 아이디어는 아닙니다.
c) 버전 번호를 전달할 수 있도록 웹 서비스 생성자를 재정의합니다. 이것은 작동하지 않는 것으로 보입니다. 리플렉션에서 WSDL 내에서 어떻게 표현 될지 확신 할 수 없습니다.

일반적으로 받아 들여지는 방법이 있습니까, 아니면이 분야에서의 경험을 토대로 조언을 제공합니까?

답변

6

일반적으로 버전 관리 메서드 이름과 .asmx 파일 이름보다 웹 서비스의 버전을 지정하는 것이 더 있습니다. 이론적으로 웹 서비스 (WSDL)에 대한 인터페이스는 영구 계약이어야하며 절대 변경해서는 안됩니다. 그 중 하나는 변경된 기능을 필요로하지 않는 클라이언트가 절대로 변경하지 않아도되므로 다시 테스트 할 필요가 없다는 것입니다.

기존 계약을 위반하는 대신 변경된 작업이 포함 된 새 계약을 생성해야합니다. 이 계약은 기존 계약에서 상속받을 수 있습니다. 즉, "끝까지 추가 할 수 있습니다". 그러나 새 계약을 새 XML 네임 스페이스에도 넣어야합니다. 네임 스페이스는 기본적으로 WSDL을 식별하고 네임 스페이스를 keping하지만 WSDL을 변경하는 것은 거짓말입니다.

그러면 새 끝점 (.asmx 파일)에서이 새 계약을 구현해야합니다. 이것이 다른 디렉토리에 있는지 또는 다른 웹 사이트에 있는지 여부는 별 문제가되지 않습니다. 중요한 점은 새 기능을 원하는 고객은 새 URL에서 새 WSDL을 참조하고 새 URL에서 새 서비스를 호출하고 만족할 수 있다는 것입니다.

기존 계약을 변경하면 다음에 "웹 참조 업데이트"가 수행 될 때 이 클라이언트 프록시 클래스의 코드 인이됩니다. 대부분의 상점에서 코드를 변경하려면 다시 테스트하고 다시 배포해야합니다. 그러므로 기존의 클라이언트 코드가 새로운 메소드를 사용하지 않아도 "단지 메소드 추가"를 "테스트하고 배치해야하는 클라이언트 코드를 추가하는 것"으로 생각해야합니다.

7

우리는 예를 들어, 버전 디렉토리에 배포 :

http://www.example.com/soap/v1/ http://www.example.com/soap/v2/ http://www.example.com/soap/v3/

+0

나는 이것이 좋은 방법이라고 생각하며 많은 조직에서이 방법을 사용합니다. 이는 사용자가 다른 버전의 서비스에 액세스하고 있음을 명확하게 보여줍니다. – BobbyShaftoe

+0

합리적인 옵션 인 것처럼 보이지만 웹 서비스는 다른 코드를 사용하고 있으며 기존 사용자는 모두 "메인"사이트 (즉, 버전 지정하지 않고)를 참조하게 될 것입니다. –

+0

@ 스티브 위트 (Steve Weet)는 예제를 계속하고 directoy ala를 만들면 해결되지 않겠는가? http://www.example.com/soap/current/ - 그냥 최신 버전으로 매핑하겠습니까? 메소드에 버전 번호를 넣으면 API가 모든 역사에 관심이없는 새로운 사용자에게 복잡해집니다. – Thies

0

당신은 각각의 새로운 버전으로 메소드 서명의 대부분을 변경하지 않는 한, 내가 함께 갈 것 (a) - 버전 관리 된 메소드 이름. 이것은 우리의 공급자가 그것을 어떻게하는 것이고 그것은 우리를 위해 잘 작동합니다.

2

나는 아주 깨끗한 다른 해결책을 생각해 보았습니다.

SOAP 헤더로 포함 된 버전 번호를 확인하고 제공되지 않는 경우 기존 버전 번호로 간주 할 수 있습니다.

그러면 메소드 서명을 변경하지 않고도 버전에 따라 코드가 다르게 동작 할 수 있습니다. 웹 서비스의 반환 값이 XML 객체이므로 메소드 서명이 동일하게 유지되지만 XML의 내용은 버전을 기반으로 변경됩니다.

+0

저는 개인적으로 헤더에 헤더가 숨겨져 있기 때문에 개인적으로이 접근법을 좋아하지 않습니다. 변경 사항이 이전 호출자의 계약에 영향을 미치지 않습니다 (즉, 이전 호출자가 이해하지 못하는 부분을 무시하는 방식으로 데이터를 반환 할 수 있음) 또는 계약에 영향을 미치지 않습니다. 계약에 영향을 미치고 있다면 그 사실을 선언하는 것에 대해 명시해야합니다 (IMO). – sfitts

2

내가 개발중인 웹 서비스와 동일한 버전 관리 문제가 있습니다. 사용자는 헤더에 스키마 버전 번호를 전달합니다. 그들은 원하는 XML 스키마 버전을 알려줍니다. 이렇게하면 우리는 항상 하위 호환이 가능하며 코드는 중복되지 않습니다.

내 직업은 우리가 버전을 바꿀 때 URL을 웹 서비스로 전환해야한다고 클라이언트에게 말할 수 없습니다. 대기업에서는 URL만큼 작은 변화가 몇 달 동안 걸릴 수 있습니다. 고객과의 연결을 끊지 말아야한다는 것이 내 생각입니다. 우리가하는 일은 최신 버전에 새로운 기능을 추가하는 것입니다. 클라이언트가 새 기능을 요구하면 원하는 경우 최신 스키마로 업그레이드해야합니다.

관련 문제