2008-08-08 9 views
7

일부 WCF 서비스를 만들려고하고 있지만 레거시 (.NET 1.1 및 2.0) 클라이언트 응용 프로그램과 역 호환되도록 요구하고 있습니다.WCF 서비스 - 이전 버전과의 호환성 문제

서비스가 3.0 이상 클라이언트에서 올바르게 실행되도록 관리했지만, 필요한 호환성을 위해 필요하다고 생각되는 basicHttpBinding 끝점을 사용하여 서비스를 게시 할 때 서비스 리팩터가 내 메서드 서명 . 예 :

public bool MethodToReturnTrue(string seedValue); 

내가 내 자신의 호스팅 콘솔 응용 프로그램에 대한의 app.config에서 생각할 수있는 모든 구성 매개 변수를 시도했습니다

public void MethodToReturnTrue(string seedValue, out bool result, out bool MethodToReturnTrueResultSpecified); 

으로 클라이언트 응용 프로그램에 나타납니다,하지만 난 수없는 것 이 기능을 예상대로 사용하십시오. 이것이 내 기대치에 결함이 있다는 사실로 이어질 수도 있지만, 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> 

아무도 조언 해 줄 수 있습니까?

답변

3

좋아, 우리는이 문제를 단기간에 해결할 필요가있어서 "interop"또는 호환성 레이어에 대한 아이디어를 생각해 냈습니다.

Baiscally, 우리가 한 모든 작업은 전통적인 ASMX 웹 서비스를 프로젝트에 추가하고 기본 WCF 호출을 사용하여 WCF 서비스를 호출했습니다. 그런 다음 상당한 양의 리팩터링 작업없이 적절한 유형을 클라이언트 응용 프로그램으로 되돌릴 수있었습니다. 나는 그것이 해킹 된 솔루션이라는 것을 알고 있었지만, 우리가 그렇게 큰 레거시 코드 기반을 가지고있는 최선의 선택이었습니다. 그리고 추가 된 보너스는 놀랍게도 실제로 잘 작동한다는 것입니다. :)

3

아, 이것은 나를 죽이고 있습니다! 약 3 개월 전 직장에서이 작업을했는데 이제 모든 세부 사항을 기억할 수 없습니다.

그러나 basicHttpBinding이 필요하고 새 serializer (기본값)를 사용할 수 없다는 점을 기억하십시오. "이전"XmlSerializer를 사용해야합니다.

불행히도, 나는 더 이상이 작업을 수행하지 않아 코드를 살펴볼 수 없습니다. 내 상사에게 전화해서 내가 무엇을 파 내는지 볼거야.

0

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 이름 (WCF뿐만 아니라 인터페이스 이름, ASMX가 수행되지 않음) ASMX 액션 이름을 다르게 구성되어 있기 때문에 수동으로 조작 작업 이름을 설정해야합니다.

사용하는 모든 데이터 계약은 [DataContract]이 아닌 [XmlType]으로 장식되어야합니다.

설정 파일을 변경할 필요가 없습니다.