WCF 서비스 - 이전 버전과의 호환성 문제
-
08-06-2019 - |
문제
일부 WCF 서비스를 만드는 중인데 레거시(.NET 1.1 및 2.0) 클라이언트 응용 프로그램과 역호환되도록 해야 합니다.
3.0 이상의 클라이언트에 대해 서비스가 올바르게 실행되도록 관리했지만 basicHttpBinding 끝점(필요한 호환성을 위해 필요하다고 생각함)을 사용하여 서비스를 게시하면 서비스가 내 메서드 서명을 리팩터링합니다.예를 들어
public bool MethodToReturnTrue(string seedValue);
클라이언트 앱에는 다음과 같이 나타납니다.
public void MethodToReturnTrue(string seedValue, out bool result, out bool MethodToReturnTrueResultSpecified);
자체 호스팅 콘솔 앱의 app.config에서 생각할 수 있는 모든 구성 매개변수를 시도했지만 이 기능을 예상대로 만들 수 없는 것 같습니다.이것이 내 기대에 결함이 있다는 사실로 이어질 수 있다고 생각하지만 WCF 서비스가 하위 수준 클라이언트에 대한 bool 반환 유형을 처리할 수 없다는 사실에 놀랐습니다.
내 현재 app.config는 다음과 같습니다.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service behaviorConfiguration="MyServiceTypeBehaviors" Name="MyCompany.Services.CentreService.CentreService">
<clear />
<endpoint address="http://localhost:8080/CSMEX" binding="basicHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
<endpoint address="http://localhost:8080/CentreService" binding="basicHttpBinding" bindingName="Compatible" name="basicEndpoint" contract="MyCompany.Services.CentreService.ICentreService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors" >
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
누구든지 조언을 해주실 수 있나요?
해결책 2
좋습니다. 우리는 이 문제를 단기적으로 해결해야 했기 때문에 "상호 운용성", 즉 호환성 계층이라는 아이디어를 생각해 냈습니다.
기본적으로 우리가 한 일은 기존 ASMX 웹 서비스를 프로젝트에 추가하고 기본 WCF 호출을 사용하여 WCF 서비스를 호출하는 것뿐이었습니다.그런 다음 상당한 양의 리팩토링 작업 없이 적절한 유형을 클라이언트 애플리케이션으로 다시 반환할 수 있었습니다.나는 그것이 해키적인 솔루션이라는 것을 알고 있지만 그렇게 큰 레거시 코드 기반을 가지고 있는 최선의 선택이었습니다.그리고 추가 보너스는 실제로 놀랍게도 잘 작동한다는 것입니다.:)
다른 팁
아, 이거 정말 죽겠다!약 3개월 전에 직장에서 이 작업을 했는데 지금은 모든 세부 사항을 기억할 수 없습니다.
그러나 basicHttpBinding이 필요하고 새 직렬 변환기(기본값)를 사용할 수 없다는 것을 기억합니다."이전" XmlSerializer를 사용해야 합니다.
불행하게도 저는 이 일을 했던 곳에서 더 이상 일하지 않기 때문에 코드를 보러 갈 수는 없습니다.상사에게 전화해서 무엇을 조사할 수 있는지 알아보겠습니다.
XmlSerializer를 사용해야 합니다.예를 들어:
[ServiceContract(Namespace="CentreServiceNamespace")]
[XmlSerializerFormat(Style=OperationFormatStyle.Document, SupportFaults=true, Use=OperationFormatUse.Literal)]
public interface ICentreService {
[OperationContract(Action="CentreServiceNamespace/MethodToReturnTrue")]
bool MethodToReturnTrue(string seedValue);
}
자동 생성된 WCF 이름은 ASMX 작업 이름과 다르게 구성되므로 작업 작업 이름을 수동으로 설정해야 합니다(WCF에는 인터페이스 이름도 포함되지만 ASMX는 포함되지 않음).
사용하는 모든 데이터 계약은 다음과 같이 장식되어야 합니다. [XmlType]
오히려 [DataContract]
.
구성 파일을 변경할 필요가 없습니다.