2011-02-16 2 views
0

WCF에서 편안한 서비스를 구현하려고하지만 서비스가 전달 된 XML을 deserialize 할 수 없다는 문제가 있습니다. 루트 요소를 데이터 계약이 아닌 운영 계약에 매핑하려고합니다. 이 수준에서 동작 계약을 기대하고 있기 때문에 예를 들어, 다음 XML 패킷으로,WCF/RESTful DataContract deserialization 문제

<MyObject> 
    <MyField1>asdf</MyField1> 
    <MyField2>1234</MyField2> 
    ... 
</MyObject> 

는 입력 메시지로 MyObject를 직렬화 할 수없는입니다.

1) 5 개 이상의 매개 변수가 있고 2) 확장 데이터를위한 공간을 남겨 두지 않기 때문에 모든 필드를 작업 계약의 매개 변수로 사용하고 싶지 않습니다.

들어오는 요청을 기록하도록 동작 확장을 설정했습니다. 수신 메시지를 제대로 deserialize하기 위해 루트 요소로 래핑해야합니까? 아니면 클라이언트가 구현을 변경하지 않고도이 작업을 수행하는 덜 해킹 된 방법이 있습니까?

감사

+0

당신이 전화하는 예외/클라이언트 및 구현 방법에 대한 자세한 내용을 제공 할 수 있습니까? – genericuser

+0

테스트하는 동안 클라이언트가 피들러입니다. WcfTestClient.exe는 작업의 루트 요소를 명확하게 들여 쓰지 만 클라이언트 개발자는 데이터 계약에 매핑하려는 ''주위에 루트 노드를 제공 할 수 없습니다. – devlord

답변

1

내 솔루션은 기존 DataContract와

var msg = message.GetBody<MyObject>(); 

를 사용하여 메시지를

[OperationContract(Action="*")] 
void ProcessMessage(Message message); 

내 운영 계약을 변경하고 역 직렬화하는 것이 었습니다.

업데이트 : 호출 서비스에서 xml blob의 필드 순서를 재정렬 할 수 있으므로 실제로는 deserialization에 XmlSerializer를 사용하기로했습니다.