2011-09-07 7 views
7

Próbowałem połączyć się z niektórymi usługami sieciowymi za pomocą WCF, ale ciągle dostaję błąd, gdy próbuję wywołać funkcję, której potrzebuję.System.InvalidOperationException: Atrybut XmlSerializer System.Xml.Serialization.XmlChoiceIdentifierAttribute nie jest prawidłowy w Item

Jest to błąd Dostaję:

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.

Błąd dzieje się, zanim jeszcze dojdzie do wywoływania rzeczywistą usługę i to nawet nie wystąpić z powodu sposobu Próbuję połączenie. Problem dotyczy innej metody zdefiniowanej w klasie generowanej przez WCF.

udało mi się prześledzić sprawę do sekcji kodu w XSD, który jest używany do określenia WSDL:

<xs:choice minOccurs="0"> 
<xs:element name="additionalSocInd" type="tns:BinaryExpressionType"/> 
<xs:element name="skipServiceValidationInd" type="tns:BinaryExpressionType"/> 
</xs:choice> 

Odpowiedni wygenerowany kod:

[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, 
} 

Kiedy komentarz z powyższego wyliczenia i wszystkich odniesień do niego usługa działa. Są inne instrukcje xs: choice w XSD, które nie powodują żadnych problemów.


Aktualizacja: Dalsze badania wykazały, że gdy masz następujące elementy:

Element definiuje się bezpośrednio wewnątrz elementu sekwencji:

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

Pełnomocnik generowane przez svcutil powoduje błąd zapisane powyżej.

Kiedy zmienił się wyglądać następująco:

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

Błąd odchodzi. Może to być błąd związany z kodem generowanym przez generator (svcutil).


Będę musiał wywołać wszystkie metody w WSDL, więc komentowanie tych, które nie działają, nie jest opcją. I muszę go uruchomić bez zmiany WSDL (który jest klientem, a nie naszym). Każda pomoc będzie doceniona.

+0

Biorąc pod uwagę, że nie można zmienić WSDL i SvcUtil nie będzie poprawnie analizować ten XSD w tym WSDL, wydaje swoją jedyną realną wyboru jest utworzenie kodu klienta poprzez nadanie SvcUtil swojej edytowanej wersji WSDL. Jeśli ten kod klienta działa poprawnie z usługą, musisz przejść ten sam ręczny proces za każdym razem, gdy zmieni się WSDL. Domyślam się, że jeśli istnieje "błąd", najprawdopodobniej jest to w XSD WSDL twojego klienta, niż w logice parsowania SvcUtil XSD :) –

+0

Nie dodawaj "WCF & C# -" do swoich tytułów. Tagi już kategoryzują pytanie. –

Odpowiedz

7

próby wygenerowania pełnomocnika z linii poleceń z tymi flagami:

svcutil /wrapped /serializer:XmlSerializer http://wsdl_url/ 
+0

Dzięki Yaron! Flaga/opakowana to zrobiła. Naprawdę doceniam twoją pomoc w tej sprawie! – criel

+0

Używam .Net 3.5, dokumentacja svcutil wspomina/opakowała, ale kiedy próbuję go użyć, to mówi/opakowane jest nierozpoznane. Jakieś pomysły? –