2010-08-30 18 views
7

ho provato a cercare questo in su in linea, ma tutti gli esempi WSDL sembrano non proprio spiegare se devo segnare cose come stringa BaseType nel WSDL o int ...WSDL, enumerazioni e C#: E 'ancora oscuro

Fondamentalmente, sto cercando di creare il mio WSDL in modo che possa rappresentare un'enumerazione. Ho un C# Enum in mente già che voglio abbinare fino a ...

public enum MyEnum { 
    Item1 = 0, 
    Item2 = 1, 
    Item3 = 2, 
    SpecialItem = 99 
} 

io non sono sicuro di come il mio WSDL dovrebbe apparire ... Immagino che sia uno dei due, ma anche allora io non sto sicuro al 100% ...

<wsdl:types> 
    <xsd:schema targetNamespace="http://www.mysite.com/MyApp" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       > 
     <xsd:simpleType name="MyEnum"> 
      <xsd:restriction base="xsd:int"> 
       <xsd:enumeration value="0" /> 
       <xsd:enumeration value="1" /> 
       <xsd:enumeration value="2" /> 
       <xsd:enumeration value="99" /> 
      </xsd:restriction> 
     </xsd:simpleType> 
    </xsd:schema> 
</wsdl:types> 

O

<wsdl:types> 
    <xsd:schema targetNamespace="http://www.mysite.com/MyApp" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       > 
     <xsd:simpleType name="MyEnum"> 
      <xsd:restriction base="xsd:string"> 
       <xsd:enumeration value="Item1" /> 
       <xsd:enumeration value="Item2" /> 
       <xsd:enumeration value="Item3" /> 
       <xsd:enumeration value="SpecialItem" /> 
      </xsd:restriction> 
     </xsd:simpleType> 
    </xsd:schema> 
</wsdl:types> 

risposta

9

enumerazioni finirà per assomigliare loro rappresentazioni di stringa. Così il WSDL corretto presenterà le enumerazioni come:

<xs:simpleType name="MyEnum"> 
    <xs:restriction base="xsd:string"> 
     <xs:enumeration value="Item1" /> 
     <xs:enumeration value="Item2" /> 
     <xs:enumeration value="Item3" /> 
     <xs:enumeration value="SpecialItem" /> 
    </xs:restriction> 
    </xs:simpleType> 

questo verrà fatto automaticamente serializzare/deserializzare al tipo MyEnum enumerazione per voi. Se presenti l'enumerazione come xsd: int allora finirai per doverli convertire manualmente avanti e indietro.

È possibile fare riferimento alla definizione di enumerazione entro lo schema in questo modo:

<xsd:complexType name="Class1"> 
    <xsd:sequence> 
     <xsd:element minOccurs="1" maxOccurs="1" name="MyEnumProperty" type="MyEnum" /> 
    </xsd:sequence> 
    </xsd:complexType> 
+0

Come fa a sapere che voglio SpecialItem per essere 99? O non importa come sia effettivamente implementato? Fondamentalmente quando creo un messaggio di risposta, aggiungo semplicemente MyEnum e lo serializza in modo che non memorizzi il valore int base dell'enum, ma piuttosto il nome stringa in modo che l'altra estremità possa riceverlo per nome invece del valore base? Ha senso? –

+0

Il serializzatore in realtà non interessa. Assicurati solo di impostare i valori sul tipo MyEnum, non su un intero. Inoltre, devi sempre assicurarti che le tue definizioni lato server e lato client per l'enumerazione MyEnum siano identiche, altrimenti otterrai risultati indesiderati. – code4life

+0

Quindi in pratica serializza il nome (ad esempio "SpecialItem") e non gli interessa quale SpecialItem è assegnato ... ma, per mia chiarezza, dovrei assegnare entrambi i 99 su Client e Server? Sarebbe un pasticcio se l'avessi assegnato 100 sul client e 99 sul server, supponendo che non lo tenessi conto nella loro programmazione separata? –