Я пытался подключиться к некоторым веб-службам, используя WCF, но продолжаю получать сообщение об ошибке при попытке вызвать нужную мне функцию.
Это ошибка, которую я получаю:
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.
Ошибка возникает еще до того, как она вызывает обычный сервис, и даже не возникает из-за метода, который я пытаюсь вызвать.Проблема связана с другим методом, определенным в сгенерированном классе WCF.
Мне удалось отследить проблему до раздела кода в XSD, который используется для определения WSDL:
<xs:choice minOccurs="0">
<xs:element name="additionalSocInd" type="tns:BinaryExpressionType"/>
<xs:element name="skipServiceValidationInd" type="tns:BinaryExpressionType"/>
</xs:choice>
Соответствующий сгенерированный код:
[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,
}
Когда я закомментирую перечисленное выше перечисление и все ссылки на него, сервис работает.В XSD есть другие операторы xs: choice, которые, похоже, не вызывают проблем.
Обновление: дальнейшее расследование показало, что при наличии следующего:
Элемент определяется непосредственно внутри элемента последовательности:
<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>
Сгенерированный проксиby svcutil вызывает ошибку, указанную выше.
При изменении выглядит так:
<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>
Ошибка исчезает.Так что это может быть ошибка с кодом, который генерирует генератор (svcutil).
Мне нужно будет вызвать все методы в WSDL, поэтому комментировать те, которые не работают, неопция.И мне нужно, чтобы он работал без изменения WSDL (который принадлежит клиенту, а не нашему).Любая помощь будет оценена.