2011-09-07 16 views
7

WCF kullanarak bazı web hizmetlerine bağlanmaya çalışıyorum ancak ihtiyacım olan işlevi çağırmaya çalıştığımda hata almaya devam ediyorum. hatta fiili servisi arayarak alır ve yöntemin ben çalışıyorum çünkü bile oluşmaz önceSystem.InvalidOperationException: XmlSerializer özniteliği System.Xml.Serialization.XmlChoiceIdentifierAttribute öğesinde geçerli değil

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.

hata olur:

Bu

alıyorum hatadır aramak. Sorun, WCF tarafından oluşturulan sınıfta tanımlanan başka bir yöntemle.

WSDL'nin tanımlamak için kullanılır XSD kod bölümüne sorunu izlemek mümkün olmuştur

:

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

üretilen mukabil kod: ben yorum

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

Yukarıdaki enum ve tüm referanslar, hizmet çalışır. Başka xs vardır: XSD'de herhangi bir soruna yol açmayan seçim ifadeleri.


güncelle:

elemanının bir dizi elemanının içine doğrudan tanımlanır:

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

Svcutil tarafından oluşturulan proxy hataya neden olur fazla araştırma aşağıdakilere sahip olduğunda ortaya yukarıda not edildi. Bu gibi görünmeye değişti

:

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

hata ortadan kalkar. Yani jeneratör (svcutil) üreten kodla bir hata olabilir.


WSDL'nin tüm yöntemleri çağırmak gerekir, bu yüzden işe yaramaz olanları yorumlama bir seçenek değildir edecektir

. Ve WSDL'yi (istemcinin değil, bizimki değil) değiştirmeden çalışmalıyım. Herhangi bir yardım takdir edilecektir.

+0

Eğer WSDL değiştiremezsiniz ve SvcUtil doğru o WSDL o XSD ayrıştırmak olmayacağını göz önünde bulundurulduğunda, tek gerçekçi seçenek olarak görünüyor SvcUtil'i WSDL'nin düzenlenmiş sürümüne vererek istemci kodunu oluşturmaktır. Bu müşteri kodu hizmetle doğru şekilde çalışıyorsa, WSDL her değiştiğinde aynı manuel işlemden geçmeniz gerekir. Benim tahminim eğer bir "hata" varsa, müşterinizin WSDL'sinin XSD'sinde SvcUtil XSD ayrıştırma mantığına göre daha fazladır :) –

+0

Lütfen başlıklarınıza "WCF & C# -" eklemeyin. Etiketler zaten soruyu kategorilere ayırıyor. –

cevap

7

deneyin bu bayraklarıyla komut satırından proxy oluşturmak için:

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

Teşekkürler Yaron!/Sarma bayrak yaptı. Bunun için yardımın için gerçekten minnettarım! – criel

+0

Kullanıyorum. Net 3.5, svcutil belgelerine atıfta/sarılı, ancak kullanmaya çalıştığımda,/sarılmış tanınmadığını söylüyor. Herhangi bir fikir? –

İlgili konular