문제

내 다른 게시물에 따라 WCF 서비스 반환 값, 나는 다른 회사의 웹 서비스를 소비하고 있으며 Visual Studio 내부에서 서비스 참조를 추가 할 때 메소드의 반환 값은 유형의 객체입니다. object.

웹 서비스의 저자가 나에게 코드를 보여 주었고 실제로 유형 된 객체를 반환합니다.

내가 뭔가를 놓치고 있습니까, 아니면 프록시 클래스가 입력 된 값을 반환해야합니까?

프록시 클래스 또는 실제 서비스를 생성하기위한 설정이 있습니까?

업데이트:

WCF 서비스 뒤에있는 실제 클래스를보고 서비스 방법의 반환 값이 실제로 반환되고 있음을 깨달았습니다. 상호 작용, 콘크리트 유형이 구현됩니다. 콘크리트 유형에는 [DataContract] 속성 (및 적절한 [Datamember] 속성)가 표시되지만 인터페이스에는 그러한 속성이 없습니다. 이로 인해 서비스가 리턴 유형을 객체로 설정하게 할 수 있습니까?

도움이 되었습니까?

해결책

가설 적으로, 당신이 서비스 개발자라면, 당신은 KnownTypeAttribute:

[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}

[DataContract]
public class MyConcreteClass : IMyInterface {
}

나는 개인적으로 인터페이스를 사용하여 이것을 시도하지 않았지만 추상 기본 클래스로 시도해 보았고 잘 작동합니다. 클라이언트가 반환 값을 받으면 파생 클래스로 성공적으로 다운 캐스트 할 수 있습니다.

서비스 코드가 실제로이를 수행 할 수 있으며 문제는 다음과 같습니다. svcutil.exe 프록시 클래스를 정확하게 생성하지 않습니다.

서비스 코드를 제어하지는 않지만 클라이언트 프록시 코드를 제어합니다. 프록시 클래스를 수동으로 편집 할 수 있습니다 svcutil.exe 당신에게 추가하기 위해 당신에게 주었다 KnownTypeAttribute 당신 자신. 이렇게함으로써, 당신은 당신의 마지막에 데이터 콘텐츠 서실 라이저의 동작을 제어하고 있으며, 실수로 데이터의 와이어 형식을 변경하지 않는 한 여전히 여전히 작동해야합니다.

다른 팁

프록시 클래스는 생성 된 파일이므로 실수가 포함될 수 있습니다. 데이터 계약서 사본이있는 경우 프록시 클래스를 자유롭게 변경하여 System.Object 그리고 상황은 제대로 작동해야합니다.

Visual Studio "서비스 참조 추가"도구 및 svcutil.exe 프록시 클래스를 생성하는 데 매우 능숙하지만 완벽하지는 않습니다. 그들이 생성하는 파일은 수정해야 할 파일이며, 적절한 데이터 계약을 반환하기 위해 작업을 간단히 수정하는 것이 좋습니다.

WCF에서 Java 웹 서비스를 소비 할 때도 비슷한 문제가있었습니다.

우리의 경우 반환되었다고 말한 유형은 실제로 반환 된 것의 제한된 버전이라고합니다.

우리를 위해 일한 것은 예상되는 유형에 물건을 캐스팅하는 것이 었습니다. 그 후 데이터를 사용할 수있었습니다.

따라서 문제를 해결하려면 예상 한 유형에 객체를 캐스팅하려고 시도 할 수 있습니다.

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