Wie kann man vermeiden Process = „lax“ in WCF WSDL von Klassen Umsetzung IXmlSerializable?

StackOverflow https://stackoverflow.com/questions/1619448

  •  06-07-2019
  •  | 
  •  

Frage

Ich habe einen WCF-Dienst in einer vertrags ersten Mode geschrieben. Da einige der Elemente in dem Schema Attribut verwendet, hatte ich eine benutzerdefinierte Serialisierung für diesen (mit IXmlSerializable) zu erstellen. Im Folgenden ist ein Ausschnitt aus dem Schema, und die Klassen, sowie das Schema aus der WSDL-Datei ausgegeben.

Mein Problem ist, dass, obwohl ich die XSD für meine IXmlSerializable Klassen machen, wird das Schema nicht in der WSDL-Datei enthalten. Sie sind nur mit processContents="lax" verwiesen. Dies scheint ein Problem für die Verbraucher von meinen Dienstleistungen zu sein, da sie nicht ihre Assistenten verwenden können Kunden zu erstellen.

Hat jemand dieses Problem gestoßen? Gibt es trotzdem, die WSDL-Datei Ausgabe zu steuern, dies zu vermeiden. Ich erlebe das gleiche Verhalten sowohl die Nachrichtenverträge und Datenverträge mit.

Das Schema für die Sammlung und Artikel:

<xs:element name="TelephoneList">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Telephone" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Telephone">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="Type">
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:enumeration value="Preferred"/>
                                <xs:enumeration value="Office"/>
                                <xs:enumeration value="Mobile"/>
                                <xs:enumeration value="Home"/>
                                <xs:enumeration value="MobilePhoneFromExternalPartner"/>
                                <xs:enumeration value="HomePhoneFromExternalPartner"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
      </xs:element>

Die Sammlung Klasse:

[CollectionDataContract(ItemName = "Telephone", Name = "TelephoneList", Namespace = Schema.WorkOrderNamespace)]
public class TelephoneSet : SetBase<Telephone>
{    }

Die Elementklasse:

    [XmlSchemaProvider("GetSchemaFile")]
    public class Telephone : CustomSerializedEntity //The base class implements IXmlSerializable
    {
        public virtual TelephoneType? Type { get; set; }
        public virtual string Number { get; set; }

        /// <remarks>This method is referenced in the <seealso cref="XmlSchemaProviderAttribute"/> decoration.</remarks>
        public static XmlSchemaComplexType GetSchemaFile(XmlSchemaSet xs)
        {
            return CreateSchema(xs, "Telephone");
        }

        public override void ReadXml(XmlReader reader)
        {
            Type = ReadEnumAttribute<TelephoneType?>(reader, "Type");
            reader.MoveToElement();
            Number = reader.Value;
        }

        public override void WriteXml(XmlWriter writer)
        {
            WriteAttribute(writer, "Type", Type);
            if (!string.IsNullOrEmpty(Number))
            {
                writer.WriteValue(Number);
            }
        }
    }

Die XSD durch die erbrachte Dienstleistung:

<xs:complexType name="TelephoneList">
      <xs:sequence>
         <xs:element minOccurs="0" maxOccurs="unbounded" name="Telephone" nillable="true">
            <xs:complexType>
               <xs:sequence>
                  <xs:any minOccurs="0" processContents="lax"/>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
      </xs:sequence>
   </xs:complexType>
   <xs:element name="TelephoneList" nillable="true" type="tns:TelephoneList"/>
War es hilfreich?

Lösung

Sie Rückkehr ein XmlSchemaComplexType von Ihrer GetSchemaFile Methode, aber der Vertrag des Verfahrens zur XmlSchemaProviderAttribute schreibt vor, dass Sie XmlQualifiedName zurückkehren. Aus den Erläuterungen Abschnitt der MSDN-Dokumentation für XmlSchemaProviderAttribute :

  

Die Method Eigenschaft gibt den Namen einer statischen Methode durch Reflexion. Das Verfahren, das durchgeführt werden muss, muss einen einzigen Parameter nehmen, ein XmlSchemaSet Objekt, welches das Verfahren mit einem Objekt XmlSchema auffüllt. Das Verfahren muß auch ein XmlQualifiedName Objekt zurück, die den Datentyp kennzeichnet.

Der Grund dafür ist einfach: stellen Sie sich verschiedene Arten in Ihrem Schema hatte, wie würde es wissen, welches die Klasse es reflektiert darstellt? Also durch eine XmlQualifiedName Rückkehr Sie tatsächlich sagen, diese Klasse Karten dieser Art in diesem Schema.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top