System.InvalidOperationException: атрибут XmlSerializer System.Xml.Serialization.XmlChoiceIdentifierAttribute недопустим в элементе - PullRequest
7 голосов
/ 07 сентября 2011

Я пытался подключиться к некоторым веб-службам, используя 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 (который принадлежит клиенту, а не нашему).Любая помощь будет оценена.

1 Ответ

7 голосов
/ 09 сентября 2011

Попробуйте сгенерировать прокси из командной строки с такими флагами:

svcutil /wrapped /serializer:XmlSerializer http://wsdl_url/
...