2010-03-04 14 views
12

Tengo el siguiente tipo de WSDL (que es generada por la herramienta de terceros):WCF: Colección tipo de proxy en el cliente

<xsd:complexType name="IntArray"> 
    <xsd:sequence> 
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:int" /> 
    </xsd:sequence> 
</xsd:complexType> 

veces Visual Studio genera:

public class IntArray : System.Collections.Generic.List<int> {} 

Y a veces doesn No genera ningún tipo de proxy para este wsdl y solo usa int [].

El tipo de colección en la configuración del servicio web es System.Array.

¿Cuál podría ser el motivo de tal comportamiento predecible?

Editado:

he encontrado la manera cómo puedo reproducir este comportamiento.

Para examle tenemos dos tipos:

<xsd:complexType name="IntArray"> 
    <xsd:sequence> 
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:int" /> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="StringArray"> 
    <xsd:sequence> 
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:string" /> 
    </xsd:sequence> 
</xsd:complexType> 

VS genera:

public class IntArray : System.Collections.Generic.List<int> {} 

public class StringArray : System.Collections.Generic.List<string> {} 

Ahora cambiar el tipo de StringArray:

<xsd:complexType name="StringArray"> 
    <xsd:sequence> 
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:string" /> 
    <xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##any" processContents="lax" /> 
    </xsd:sequence> 
    <xsd:anyAttribute namespace="##any" processContents="lax"/> 
</xsd:complexType> 

VS genera tipo de proxy por sólo StringArray. Pero no para IntArray.

Editado:

Reference.svcmap:

<ClientOptions> 
    <GenerateAsynchronousMethods>false</GenerateAsynchronousMethods> 
    <EnableDataBinding>true</EnableDataBinding> 
    <ExcludedTypes /> 
    <ImportXmlTypes>false</ImportXmlTypes> 
    <GenerateInternalTypes>false</GenerateInternalTypes> 
    <GenerateMessageContracts>false</GenerateMessageContracts> 
    <NamespaceMappings /> 
    <CollectionMappings /> 
    <GenerateSerializableTypes>true</GenerateSerializableTypes> 
    <Serializer>Auto</Serializer> 
    <ReferenceAllAssemblies>true</ReferenceAllAssemblies> 
    <ReferencedAssemblies /> 
    <ReferencedDataContractTypes /> 
    <ServiceContractMappings /> 
    </ClientOptions> 
+0

¿Puede dar algunos detalles más sobre la forma en que está generando el proxy del lado del cliente? – slugster

+0

Estoy usando VS 2008 "Agregar referencia de servicio": Nivel de acceso para clases generadas: público; Operaciones asincrónicas: no verificado; Generar siempre contratos de mensajes: no marcado; Tipo de colección: System.Array; Tipo de colección de diccionario: System.Collections.Generic.Dictionary; Tipos de reutilización en todos los ensamblados a los que se hace referencia: marcado. –

Respuesta

9

Si visualiza todos los archivos del proyecto y luego visualiza el archivo llamado Reference.svcmap para obtener la referencia de servicio adecuada, ¿podría decirme cuáles son las siguientes opciones de configuración en el xml?

<ExcludedTypes /> 
<ImportXmlTypes>false</ImportXmlTypes> 
<GenerateInternalTypes>false</GenerateInternalTypes> 
<GenerateSerializableTypes>false</GenerateSerializableTypes> 
<Serializer>Auto</Serializer> 

Disculpa por ponerlo como una respuesta, pero fue terriblemente ilegible en los comentarios.

Editar

Ok, así que lo que está sucediendo aquí es el siguiente:

  1. está usando el auto para el serializador.
  2. El valor predeterminado es DataContractSerializer
  3. Al generar el código de proxy, se comprueba si hay elementos xsd prohibidos.
  4. Si se encuentran elementos prohibidos, se utiliza el XmlSerializer.

En su caso, agregar el elemento xsd: any está haciendo que cambie el modo de serialización.Si desea una serialización consistente, deberá eliminar el elemento prohibido o forzar a la generación del proxy a usar XmlSerialization todo el tiempo.

Here es un enlace sobre los elementos de esquema permitidos para el DataContractSerializer.

Saludos -Leigh

+0

He editado la pregunta. –

+0

¡Genial! ¡Gracias! –

0

Por lo que yo sé, clases de proxy se generan por SvcUtil.exe ¿por qué no se mire con reflector ...

+1

VS no usa svcutil cuando genera proxies. – slugster

+0

Tienes razón. VS 2005 lo usa, pero no en 2008. –

Cuestiones relacionadas