代码之家  ›  专栏  ›  技术社区  ›  Daniel

为什么为这个WSDL生成的.NET代理会删除一些数据?

  •  1
  • Daniel  · 技术社区  · 16 年前

    我已经使用此WSDL向.NET项目添加了一个WCF服务引用: https://interop.cmiservices.org/axis/services/CAP1_1?wsdl

    它生成代理类等,我可以调用这些方法。但是,当调用“getcapalerts”或“getcapalert”时,返回值似乎缺少数据。例如,“getcapalert”返回“alert”实例,但其“info”属性始终为空。使用fiddler,我可以检查XML并查看从服务器返回的元素(请参见下文)。一个可能相关的注释:“info”在WSDL中定义为0..alert时未绑定,并且在代理中生成数组。此外,使用wse3的.NET 2.0样式的Web引用的行为也是一样的。

    作为一种解决方案,我编写了一些类来执行自己的XML序列化(即实现IXMLSerializable),并且这些类按预期进行反序列化(即信息!= NULL)。然而,手工编码这些是容易出错的,并且还有一些其他的缺点。

    为什么生成的代理类不能正确反序列化?纠正这个问题的最佳方法是什么?

    肥皂反应:

    <?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Header>
        <ns1:serverTime soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xmlns:ns1="http://dmi-services.org/CAP/1.0"></ns1:serverTime>
    </soapenv:Header>
    <soapenv:Body>
        <ns2:getCAPAlertResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://dmi-services.org">
            <getCAPAlertReturn>
                <identifier>EINC171254539121009-6228</identifier>
                <sender>dmis@cmiservices.org</sender>
                <sent>2009-12-10T17:12:05</sent>
                <status>Test</status>
                <msgType>Alert</msgType>
                <source xsi:nil="true"/>
                <scope>Private</scope>
                <restriction xsi:nil="true"/>
                <addresses xsi:nil="true"/>
                <code></code>
                <note xsi:nil="true"/>
                <references xsi:nil="true"/>
                <incidents xsi:nil="true"/>
                <info>
                    <language xsi:nil="true"/>
                    <category>Other</category>
                    <event>TEST TEST TEST Automobile Accident</event>
                    <urgency>Past</urgency>
                    <severity>Minor</severity>
                    <certainty>Unlikely</certainty>
                    <audience xsi:nil="true"/>
                    <effective xsi:nil="true"/>
                    <onset xsi:nil="true"/>
                    <expires xsi:nil="true"/>
                    <senderName>Customer Name</senderName>
                    <headline>TEST TEST FROM ETEAM INCIDENT</headline>
                    <description>desctiption</description>
                    <instruction xsi:nil="true"/>
                    <web xsi:nil="true"/>
                    <contact xsi:nil="true"/>
                </info>
            </getCAPAlertReturn>
        </ns2:getCAPAlertResponse>
    </soapenv:Body>
    

    生成的“警报”代理类:

        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.4927")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.SoapTypeAttribute(Namespace="urn:oasis:names:tc:emergency:cap:1.1")]
    public partial class Alert : object, System.ComponentModel.INotifyPropertyChanged {
    
        private string identifierField;
    
        private string senderField;
    
        private string sentField;
    
        private status statusField;
    
        private msgType msgTypeField;
    
        private string sourceField;
    
        private System.Nullable<scope> scopeField;
    
        private string restrictionField;
    
        private string addressesField;
    
        private string[] codeField;
    
        private string noteField;
    
        private string referencesField;
    
        private string incidentsField;
    
        private info[] infoField;
    
        /// <remarks/>
        public string identifier {
            get {
                return this.identifierField;
            }
            set {
                this.identifierField = value;
                this.RaisePropertyChanged("identifier");
            }
        }
    
        /// <remarks/>
        public string sender {
            get {
                return this.senderField;
            }
            set {
                this.senderField = value;
                this.RaisePropertyChanged("sender");
            }
        }
    
        /// <remarks/>
        public string sent {
            get {
                return this.sentField;
            }
            set {
                this.sentField = value;
                this.RaisePropertyChanged("sent");
            }
        }
    
        /// <remarks/>
        public status status {
            get {
                return this.statusField;
            }
            set {
                this.statusField = value;
                this.RaisePropertyChanged("status");
            }
        }
    
        /// <remarks/>
        public msgType msgType {
            get {
                return this.msgTypeField;
            }
            set {
                this.msgTypeField = value;
                this.RaisePropertyChanged("msgType");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public string source {
            get {
                return this.sourceField;
            }
            set {
                this.sourceField = value;
                this.RaisePropertyChanged("source");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public System.Nullable<scope> scope {
            get {
                return this.scopeField;
            }
            set {
                this.scopeField = value;
                this.RaisePropertyChanged("scope");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public string restriction {
            get {
                return this.restrictionField;
            }
            set {
                this.restrictionField = value;
                this.RaisePropertyChanged("restriction");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public string addresses {
            get {
                return this.addressesField;
            }
            set {
                this.addressesField = value;
                this.RaisePropertyChanged("addresses");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public string[] code {
            get {
                return this.codeField;
            }
            set {
                this.codeField = value;
                this.RaisePropertyChanged("code");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public string note {
            get {
                return this.noteField;
            }
            set {
                this.noteField = value;
                this.RaisePropertyChanged("note");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public string references {
            get {
                return this.referencesField;
            }
            set {
                this.referencesField = value;
                this.RaisePropertyChanged("references");
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public string incidents {
            get {
                return this.incidentsField;
            }
            set {
                this.incidentsField = value;
                this.RaisePropertyChanged("incidents");
            }
        }
    
        /// <remarks/>        
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public info[] info {
            get {
                return this.infoField;
            }
            set {
                this.infoField = value;
                this.RaisePropertyChanged("info");
            }
        }
    
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   Sam Harwell    11 年前

    DMIS没有正确实现警报对象。

    他们的版本使用大写字母A <Alert> 而绿洲将其定义为 <alert>

    另外,名称空间也有问题,您需要确保反序列化包含正确的名称空间。

    推荐文章