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.
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 :) –
Nie dodawaj "WCF & C# -" do swoich tytułów. Tagi już kategoryzują pytanie. –