Проблема сериализации примитивных данных с использованием WCF - PullRequest
0 голосов
/ 19 апреля 2010

Сценарий: клиентское приложение WCF, вызывающее операцию веб-службы (JAVA), для которой в качестве параметра требуется сложный объект. Уже получили метаданные.

Проблема: в операции есть несколько обязательных полей. Одним из них является перечисление. В отправленном SOAP нет поля выше (сгенерированные метаданные) - я использую диагностику WCF и средство просмотра трассировки служб Windows:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(TypeName="Consult-Filter", Namespace="http://webserviceX.org/")]
public partial class ConsFilter : object, System.ComponentModel.INotifyPropertyChanged {

    private PersonType customerTypeField;

Недвижимость:

[System.Xml.Serialization.XmlElementAttribute("customer-type", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
    public PersonType customerType {
        get {
            return this.customerTypeField;
        }
        set {
            this.customerTypeField = value;
            this.RaisePropertyChanged("customerType");
        }
    }

Перечисление:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(TypeName="Person-Type", Namespace="http://webserviceX.org/")]
    public enum PersonType {

        /// <remarks/>
        F,

        /// <remarks/>
        J,
    }

Метаданные операции:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
public partial class consultRequest {

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webserviceX.org/", Order=0)]
    [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
    public ServiceClient.ConsultServiceReference.ConsFilter filter;

    public consultRequest() {
    }

    public consultRequest(ServiceClient.ConsultServiceReference.ConsFilter filter) {
        this.filter = filter;
    }
}

Журнал трассировки:

    <MessageLogTraceRecord>
<HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<Method>POST</Method>
<QueryString></QueryString>
<WebHeaders>
<VsDebuggerCausalityData>data</VsDebuggerCausalityData>
</WebHeaders>
</HttpRequest>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none"></Action>
<ActivityId CorrelationId="correlationId" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">activityId</ActivityId>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<filter xmlns="http://webserviceX.org/">
<product-code xmlns="">116</product-code>
<customer-doc xmlns="">777777777</customer-doc>
</filter>
</s:Body>
</s:Envelope>
</MessageLogTraceRecord>

Ответы [ 2 ]

1 голос
/ 19 апреля 2010

При использовании XML Serializer для сериализации примитивных типов, которые имеют minOccurs="0" в схеме XML, добавляется дополнительное свойство. Он называется * Указано. В вашем случае я ожидаю, что у вас есть логическое свойство с именем customerTypeSpecified. Вам нужно будет установить его на true всякий раз, когда вам нужно отправить customerType.

0 голосов
/ 19 апреля 2010

Простой вопрос: если вы обычно создаете экземпляр объекта и записываете его в консоль или System.Diagnostics.WriteLine, явно используя XmlSerializer, видите ли вы такое же поведение?

...