2012-10-22 3 views
1

DataMember (isRequired : = True) 속성에 FillerInd가 있습니다. 이제 해당 필드가 비어 있거나 존재하지 않는지 어떻게 알 수 있습니까? 온라인으로 읽었을 때 필드 MissingMethodException이 발생하여 누락 된 필드가 있으면 XML의 직렬화 및 직렬화 해제 작업을 수행해야합니다. 이 방법을 구현하는 방법이나 이것이 가장 좋은 방법인지 모릅니다. 나를 올바른 길로 인도하는 데 도움이된다면 정말 고맙겠습니다.WCF에서 isRequired가 true로 설정된 필드가 있는지 확인하는 방법

답변

4

DataMember 속성 IsRequired은 메시지에 메시지가 있어야하는지 여부를 알려주기 위해 에 있어야하는지 여부를 알려줍니다. 이 예외가 발생하는 일반적인 상황은 클라이언트에 알리지 않고 IsRequired = true의 속성을 추가하여 DataContract를 업데이트 할 때입니다. 클라이언트는 속성을 포함하지 않는 직렬화 된 개체를 보내 예외를 throw합니다.

덜 일반적인 상황이지만 기본 유형의 속성을 사용하여이 문제를 재현하는 쉬운 방법은 명시 적으로 EmitDefaultValue 속성을 false로 설정하는 것입니다. 이 작업을 수행 한 다음 해당 DataContract 개체를 사용하여 작업을 호출하려고하면 예외가 throw 될 수 있습니다. 이 예제를 고려하십시오

회원 이름 유형 .... 동물 직렬화 할 수 없습니다 :이 SerializationException 다음 행과 함께 메시지와 함께 (A CommunicationException의 원인이 차례로)의 원인이됩니다

// Data Contract 
[DataContract] 
public class Animal 
{ 
    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    public string Name; 
} 

// IService 
[OperationContract] 
int GetIdentifier(Animal animal); 

// Client operation 
int id = client.GetIdentifier(new Animal()); // Causes exception 

. 이 예외는 대개 Null 값이 허용되지 않는 Null 값을 사용하려고 시도 할 때 발생합니다. 'Name'멤버는 기본값 (보통 null 또는 0)으로 설정됩니다. 멤버의 EmitDefault 설정은 'false'이며 멤버를 serialize해서는 안됨을 나타냅니다. 그러나 멤버의 IsRequired 설정은 'true'이며 직렬화되어야 함을 나타냅니다. 이 충돌은 해결할 수 없습니다. 'Name'을 기본값이 아닌 값으로 설정하십시오. 또는 DataMemberAttribute 특성의 EmitDefaultValue 속성을 true로 변경하거나 IsRequired 속성을 false로 변경할 수 있습니다.

이 문제 클라이언트 측을 우회하는 경우 (예 : 클라이언트 측에서 DataMember가 더 이상 필요하지 않도록 생성 된 서비스 참조에 대한 reference.cs를 편집하면) 서비스에서 다음과 같은 예외가 발생합니다. deserializing, 오류가 발생할 것입니다, 나는 믿습니다.


구체적인 의견과 질문으로 바꾸십시오.

필드가 비어 있는지 알려면 아무 것도하지 않아도됩니다. WCF 프레임 워크에서이 작업을 처리합니다. 필요한 경우이 문제에 대한 머리를 잡기 위해 (비) 직렬화에 연결하거나 처리하기 전에 메시지를 검사 할 수도 있습니다.

내가 말했듯이이 상황은 MissingMethodException이 아니라 SerializationExceptions 및 CommunicationExceptions을 발생시킵니다.

"IsRequired"가 필요한지 여부와 "걸릴 가장 좋은 경로"인지 여부는 알 수 없습니다. 물론 상황에 따라 다릅니다.

+0

그래서 올바르게 이해하고 클래스를 매개 변수로 사용하여 클라이언트가 해당 메서드를 호출하면 전송시 예외가 발생합니다. 아니면 'EmitDefaultValue'가 잘못되었다는 것을 알고 있습니까? – Silvermind

+1

예, 그렇습니다. clafiry하려면 : * WCF * 클라이언트는 필수 속성이 설정되지 않고 EmitDefaultValue가 false 인 객체를 보내고 (따라서 직렬화하려고 시도하는 경우) 예외를 throw합니다.이것을 우회하는 클라이언트가 있다면 * 서비스 *는 비 직렬화시 예외를 throw합니다. – Jeroen

+0

방금 ​​테스트 해 봤지만 완전히 사실이 아닙니다 (위반하지 않음). 기본값으로 설정된 경우 예외가 throw됩니다. 'Required = true, EmitDefaultValue = false'로 부울을 표시하고 클라이언트 부울에서 명시 적으로 부울을 false로 설정하면 여전히 예외가 발생합니다. 그것은 물론 논리적입니다. 속성이 실제로 트립플 상태가 아닌지 여부를 서비스가 알 수있는 방법이 없습니다. 값 유형에 대해서는'Nullable '을 고수 할 수 있으며, 문자열과 클래스의 경우'String.Empty'와'null'을 구분할 수 있습니다. 힘들어, 정말 도움이됩니다. – Silvermind