문제

일부 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].

구성 파일을 변경할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top