2012-01-18 4 views
0

C# .net 콘솔 응용 프로그램의 WSDL + XSD에서 SVCUTIL을 사용하여 클라이언트를 생성했습니다. 모두 괜찮지 만 논리적 인 오류 처리 목적을 위해 클라이언트는 WSDL에 정의되지 않은 응답 메시지를받을 수 있으므로 &의 역 직렬화는 실패하지만 메서드는 예외를 throw하지 않지만 null을 반환합니다.WCF에서 알 수없는 비누 메시지 처리

이 상황을 처리 할 수있는 일반적인 방법이 있거나 오류/메시지 xsd (서버에서 반환 한 SOAP 메시지)를 정의하고 null 응답의 경우 메시지를 처리 ​​/ 역 직렬화합니다.

추신 : 내 원격 서비스가 논리 오류에 대한 오류 예외를 throw 할 수 없습니다 (예 : 약간의 막힘).

+2

서비스가 WSDL에없는 메시지를 반환하면 서비스가 중단됩니다. 어떻게 "깨진"것이 아닌가? –

+0

안녕하세요 John, 답변 해 주셔서 감사합니다. 그것은 깨진 아니에요, 내가 메서드를 호출하고 나는 null 응답, 예외도없고, 피들러를 사용하고 그것은 다른 메시지였다 반환 된 것을 볼 메시지 계약에 의해 deserialized 수 없습니다. 논리적 오류 (제한)로 인해 비누 오류를 던질 수 없기 때문에 서비스에서 다른 메시지를 반환해야합니다. – SSA

+2

그건 말이되지 않습니다. 서비스에서 반환 할 수있는 모든 것은 WSDL에 정의되어 있어야합니다 (_must_). –

답변

2

WSDL은 계약입니다. 두 개체가 있고 그 사이에 인터페이스를 정의한 경우와 같습니다. 첫 번째 객체가 두 번째 객체에 대한 작업을 호출하면 인터페이스에 의해 정의 된 반환 값을 기대합니다. 비 강체 언어를 사용하면 두 번째 객체는 다른 유형의 반환 값을 반환 할 수 있으며 첫 번째 객체는 예기치 않은 오류로 인해 실패합니다.

프로그래밍 언어에는이 문제를 해결하는 방법이 있습니다. .NET의 경우에는 object 유형을 반환 값으로 사용하고 어떤 유형을 받았는지 수동으로 조사해야하고 반환 값을 처리하는 방법을 수동으로 조사해야합니다. WCF의 경우 우리는 또한 높은 수준의 유형 인 System.ServiceModel.Channels.Message을 가지고 있지만 실제로는 사용하지 않으려합니다. 이러한 경우 수동으로 SOAP 요청을 작성하고 수동으로 응답을 구문 분석해야하기 때문입니다.

웹 서비스의 보조 노트로 단일 요청 유형은 항상 단일 응답 유형과 0 개 이상의 오류 유형 (SOAP 오류)을 갖습니다. 단일 요청 유형에서 다른 응답 유형을 반환하는 서비스가있는 경우 해당 서비스는 "유효한"웹 서비스가 아니며 WSDL로 설명 될 수 없습니다. 그 때문에 자동 생성 WCF 프록시가 제공하는 강력한 형식의 방법도 될 수 없습니다.

+0

답장을 보내 주셔서 감사합니다. WCF와 관련하여 표준이 아닌 상황이 있습니다. 나는 다시 설명하려고 노력한다. 내 WSDL 메서드에는 입력 및 출력 매개 변수 (복합 형식) 만 있습니다.이 메서드는 논리적 오류 또는 사용자 지정 오류에 대한 예외를 수동으로 throw하는 것과 같은 어떤 것도 노출시키지 않는 도구를 사용하여 만듭니다. 따라서 우리는 출력 응답으로 다른 메시지를 전송할 수있는 옵션을 가지고 있습니다. 우리는 그것을 받아 들였고 생성 된 클라이언트는 응답을 역 직렬화 할 수 없습니다. 응답을 역 직렬화 할 수 없다는 것입니다. 그래서이 탈 직렬화 실패를 처리 할 수있는 표준 방법이 있는지 알고 싶었습니다. 분명히하기를 바랍니다. 감사합니다. – SSA

+1

아니요. 이 경우 SOAP 메시지로 직접 작업해야합니다. 다른 출력물을 쓰는 것은 웹 서비스에서 유효하지 않습니다. 여러 출력 유형이 필요한 경우 테마를 지원하기 위해 첫 번째 출력을 모델링해야합니다. 예를 들어 결과 코드 용 필드를 추가하거나 XSD 선택을 내부적으로 사용합니다. –

+0

알겠습니다. 이해합니다. Message XSD에 결과 유형 필드를 추가하고 사용자 정의 오류에 대한 응답으로이를 확인합니다. 다시 한번 감사드립니다. – SSA

관련 문제