2010-08-30 12 views
7

Traté de ver esto en línea, pero todos los ejemplos WSDL parece que realmente no explicar si debería marcar cosas como cadena BaseType en el WSDL o int ...WSDL, enumeraciones y C#: Es todavía turbia

Básicamente, estoy tratando de hacer mi WSDL para que pueda representar una enumeración. Tengo un C# Enum en cuenta ya que quiero hacerlo coincidir con ...

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

no estoy seguro de cómo mi WSDL debe mirar ... Me imagino que es uno de los dos, pero incluso entonces no estoy 100% seguro ...

<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> 

Respuesta

9

enumeraciones terminará pareciéndose a sus representaciones de cadena. Por lo que el WSDL correcta presentará las enumeraciones como:

<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> 

Lo anterior se serializar automáticamente/deserializar al tipo MyEnum enumeración para usted. Si presenta las enumeraciones como xsd: int, terminará teniendo que convertirlas manualmente de ida y vuelta.

Se puede hacer referencia a la definición de enumeración dentro de su esquema de este modo:

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

¿Cómo sabe que yo quiero SpecialItem a ser 99? ¿O no le importa cómo se implementa realmente? Básicamente, cuando creo un mensaje de respuesta, simplemente le agrego MyEnum y lo serializa de una manera que no almacena el valor int base de la enumeración, sino el nombre de la cadena para que el otro extremo pueda recibirlo por su nombre. del valor base? ¿Tiene sentido? –

+0

El serializador en realidad no le importa. Solo asegúrese de establecer los valores en el tipo MyEnum, no en un entero. Además, siempre debe asegurarse de que las definiciones del lado del servidor y del lado del cliente para la enumeración MyEnum sean idénticas, de lo contrario obtendrá resultados no deseados. – code4life

+0

Básicamente serializa el nombre (es decir, "SpecialItem") y no le importa qué SpecialItem está asignado ... pero, para mi propia claridad, ¿debería asignarles ambos 99 en Cliente y Servidor? ¿Se estropearía si lo asignara 100 en el Cliente y 99 en el servidor suponiendo que no tengo en cuenta eso en su propia programación por separado? –