He intentado conectarme a algunos servicios web utilizando WCF pero sigo recibiendo un error cuando intento llamar a la función que necesito.System.InvalidOperationException: atributo XmlSerializer System.Xml.Serialization.XmlChoiceIdentifierAttribute no es válido en el elemento
Este es el error que estoy recibiendo:
System.InvalidOperationException : XmlSerializer attribute System.Xml.Serialization.XmlChoiceIdentifierAttribute is not valid in Item. Only XmlElement, XmlArray, XmlArrayItem, XmlAnyAttribute and XmlAnyElement attributes are supported when IsWrapped is true.
El error se produce antes de que incluso llega a llamar al servicio real y ni siquiera se produce debido al método que estoy tratando de llamada. El problema es con otro método que está definido en la clase generada por WCF.
he podido rastrear el problema a una sección de código en el XSD que se utiliza para definir el WSDL:
<xs:choice minOccurs="0">
<xs:element name="additionalSocInd" type="tns:BinaryExpressionType"/>
<xs:element name="skipServiceValidationInd" type="tns:BinaryExpressionType"/>
</xs:choice>
El correspondiente código generado:
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute(Namespace="http:integration.sprint.com/interfaces/manageSubscriberServices/v1/manageSubscr" +
"iberServices.xsd", IncludeInSchema=false)]
public enum ItemChoiceType2
{
additionalSocInd,
skipServiceValidationInd,
}
Cuando comento fuera de la enumeración anterior y todas las referencias a ella, el servicio funciona. Hay otras declaraciones xs: choice en el XSD que no parecen causar ningún problema.
Actualización: Investigaciones posteriores revelaron que cuando se tiene lo siguiente:
El elemento está definida directamente en el interior de un elemento de la secuencia:
<xs:sequence>
<xs:element ... />
...
<xs:choice minOccurs="0">
<xs:element name="additionalSocInd" type="tns:BinaryExpressionType" />
<xs:element name="skipServiceValidationInd" type="tns:BinaryExpressionType" />
</xs:choice>
...
<xs:element ... />
</xs:sequence>
El proxy generada por svcutil provoca el error indicado arriba.
Cuando cambió a tener este aspecto:
<xs:sequence>
<xs:element ... />
...
<xs:element minOccurs="0" name="myChoiceType" type="tns:MyChoiceType" />
...
<xs:element ... />
</xs:sequence>
<xs:complexType name="MyChoiceType">
<xs:choice>
<xs:element name="additionalSocInd" type="tns:BinaryExpressionType" />
<xs:element name="skipServiceValidationInd" type="tns:BinaryExpressionType" />
</xs:choice>
</xs:complexType>
El error desaparece. Por lo tanto, puede ser un error con el código que genera el generador (svcutil).
que tendrá que llamar a todos los métodos en el WSDL, por lo comentando los que no trabajan, no es una opción. Y necesito hacerlo funcionar sin cambiar el WSDL (que es el del cliente, no el nuestro). Cualquier ayuda sería apreciada.
Teniendo en cuenta que no se puede cambiar el WSDL y SvcUtil no tendrá que analizar correctamente XSD en ese WSDL, parece que su única opción realista es crear el código del cliente dando a SvcUtil su versión editada del WSDL. Si ese código de cliente funciona correctamente con el servicio, deberá pasar por el mismo proceso manual cada vez que cambie WSDL. Supongo que si existe un "error" es más probable en el XSD del WSDL de su cliente que en la lógica de análisis SvcUtil XSD :) –
No agregue "WCF & C# -" a sus títulos. Las etiquetas ya categorizan la pregunta. –