WCF DataContractSerialzer xml для объектирования неполных результатов - PullRequest
1 голос
/ 26 мая 2011

Я создаю сервис-оболочку wcf, который возвращает XML из другого веб-сервиса.Что я заметил, так это то, что не весь XML из источника сериализуется в мой объект.

Вот источник xml:

<?xml version="1.0" standalone="yes"?>
<methodResponse>
    <requestId>234843080</requestId>
    <errorCode>0</errorCode>
    <errorText></errorText>
    <processingTime>00:00:00.234</processingTime>
    <results>
        <resultCode>0</resultCode>
        <resultText></resultText>
        <resultCount>1</resultCount>
        <totalResultCount>1</totalResultCount>
        <result>           
            <contactId>123</contactId>
            <sourceFolderId>3443</sourceFolderId>
            <contactState>4</contactState>
            <contactStateSortOrder>3</contactStateSortOrder>            
            <contactType>person</contactType>
            <displayName>Bond, James</displayName>            
            <office>unknown</office>
            <department></department>
            <changeDate></changeDate>
            <firstName>James</firstName>
            <middleName></middleName>
            <lastName>Bond</lastName>            
            <jobTitle>Spy</jobTitle>            
            <ape>
                <address type='Street' typeId='1' relationship='Business' relationshipId='1'>
                    <addressLine></addressLine>                    
                    <city></city>
                    <state></state>
                    <postalCode></postalCode>                                                            
                </address>
                <phone type='Phone' typeId='1' relationship='Business' relationshipId='1'>
                    <phoneNumber></phoneNumber>
                    <description/>
                    <formattedPhone></formattedPhone>
                </phone>         
            </ape>
        </result>
    </results>    
</methodResponse>

Служба оболочки wcf:

  [DataContract(Name="methodResponse", Namespace = "")]
    public partial class methodResponse {

    [DataMember]
    public int errorCode {
        get;
        set;
    }

    [DataMember]
    public string errorText {
        get;
        set;
    }

    [DataMember]
    public string requestId
    {
        get;
        set;
    }

    [DataMember]
    public methodResponseResults[] results
    {
        get;
        set;
    }
}

[DataContract(Namespace = "")]
public partial class methodResponseResults
{
    [DataMember]
    public string resultCode {
        get;
        set;
    }

    [DataMember]
    public string resultText {
        get;
        set;
    }

    [DataMember]
    public string resultCount {
        get;
        set;
    }

    [DataMember]
    public string totalResultCount {
        get;
        set;
    }

    [DataMember]
    public methodResponseResultsResult[] result {
        get;
        set;
    }
}

[DataContract(Namespace="")]
public partial class methodResponseResultsResult {

public string contactId
        {
            get;
            set;
        }
    public string displayName
    {
        get;
        set;
    }
}



  [ServiceContract]    
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class WcfWrapperService
    {

 public Response GetXml()
        {    
            string uri = ""; // uri to source web service

            var dataContractSerializer = new DataContractSerializer(typeof(methodResponse));

                using (XmlReader reader = XmlReader.Create(uri))
                {
                    var result = (methodResponse)dataContractSerializer.ReadObject(reader);
//result object looks like:    
                //result.errorCode = 0;
                //result.errorText = null;
                //result.requestId = 234843080;
                //result.results = methodResponseResults[0];
                }


    // return Response object
                }
        }

Значения errorCode, errorText, requestId есть, но результатов нет.

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Первое, что выскакивает, это то, что вы пытаетесь де / сериализовать контракт, который содержит атрибуты. DataContractSerializer имеет несколько ограничений, одним из которых является то, что он может только сериализовать / десериализовать элементы. Для правильной обработки этой схемы вам необходимо использовать XmlSerializer.

0 голосов
/ 26 мая 2011

Вы не устанавливаете никаких значений для свойства Order в атрибутах DataMember. Это означает, что элементы будут обрабатываться в алфавитном порядке, что, скорее всего, НЕ то, что вы хотите. Вы должны явно установить Order, чтобы убедиться, что он соответствует схеме документов, которые вы будете обрабатывать. Вам также может понадобиться установить IsRequired = false, если есть какие-либо элементы, которые могут быть или не быть в экземпляре документа.

...