2011-05-27 29 views
47

Yerinde bir WCF servisim var.Beklenmeyen Tür - Serileştirme İstisnası

Normal işlem, sunucunun bir geri çağrılma yoluyla istemciye bir XactTaskIn nesnesinin döndürülmesi işlemesini gerçekleştirdiğini görecektir. Bunu iyi çalışıyorum.

Sorunum, returnData değişkenini popüle edilmiş bir XactException olarak ayarlamaya çalıştığımda ve XactTaskIn'ı geri arama aracılığıyla istemciye geri göndermeyi denediğimde, şu istisnayı attığım durumudur.

İstisna - veri sözleşme adı 'XactException: http: //schemas.datacontract.org/2004/07/' ile "Tür 'XactException'. beklenmemektedir bir DataContractResolver kullanmayı düşünün veya herhangi eklemek türleri, bilinen türden bilinen türleri için bilinmemektedir - örneğin, KnownTypeAttribute özniteliği kullanılarak veya tarafından, DataContractSerializer'a aktarılan bilinen türler listesine eklenir. " (System.Runtime.Serialization.SerializationException) İstisna İleti veri sözleşme adı 'XactException: http: //schemas.datacontract.org/2004/07/' ile = "Tip 'XactException'. beklenmemektedir kullanmayı düşünün DataContractSerializer geçirilen bilinen türleri listesine ekleyerek tarafından KnownTypeAttribute özelliği veya kullanılarak örneğin ", İstisna Tipi = - bir DataContractResolver veya bilinen türleri listesine statik olarak bilinmemektedir herhangi türlerini ekleyin. "System.Runtime.Serialization.SerializationException"

İşte XactException sınıfı İşte XactTaskIn sınıf

[DataContract] 
public class XactTaskIn 
{ 
    [DataMember] 
    public DateTime timeOut; 
    [DataMember] 
    public DateTime timeIn; 
    [DataMember] 
    public string name; 
    [DataMember] 
    public string responseTo; 
    [DataMember] 
    public String moduleFromName; 
    [DataMember] 
    public String moduleFromType; 
    [DataMember] 
    public String methodFromName; 
    [DataMember] 
    public object[] originalInputs; 
    [DataMember] 
    public String returnMethodToCall; 
    [DataMember] 
    public String returnModuleToCall; 
    [DataMember] 
    public object returnData; 

    public XactTaskIn(DateTime timeOut, DateTime timeIn, string name, string responseTo, String moduleFromName, String moduleFromType, String methodFromName, object[] originalInputs, String returnMethodToCall, String returnModuleToCall, object returnData) 
    { 
     this.timeOut = timeOut; 
     this.timeIn = timeIn; 
     this.name = name; 
     this.responseTo = responseTo; 
     this.moduleFromName = moduleFromName; 
     this.moduleFromType = moduleFromType; 
     this.methodFromName = methodFromName; 
     this.originalInputs = originalInputs; 
     this.returnMethodToCall = returnMethodToCall; 
     this.returnModuleToCall = returnModuleToCall; 
     this.returnData = returnData; 
    } 
} 

olduğu:

[DataContract]  
public class XactException 
{ 
    [DataMember] 
    string message; 

    public XactException(string message) 
    { 
     this.message = message; 
     // Add implementation. 
    } 
} 

Güncelleme: Daniel dan açıklama bana çok yardımcı oldu böylece

Ok.

Sunucu artık geri çağrıyı istemciye gönderiyor gibi görünüyor, ancak istemci aşağıdaki özel durumu seçiyor.

  • yakalandı: " mesaj serisini isterken biçimlendirici bir istisna attı: parametreyi http://tempuri.org/:taskIn serisini çalışılırken bir hata oluştu InnerException mesajı ' hattı 1 pozisyon hatası oldu 960. Öğe 'http://schemas.datacontract.org/2004/07/:returnData' , adresinin 'http://schemas.datacontract.org/2004/07/ adresindeki verileri içerir: XactException '. Desperizatörün hiçbir bilgisi yoktur.Bu adada eşlenen herhangi bir tür. bir DataContractResolver kullanılarak göz önünde ya da bilinen türleri listesine 'XactException' ye karşılık gelen tipi ekleyin -., Örneğin, DataContractSerializer geçirilir bilinen tipte listesine eklemeden KnownTypeAttribute niteliğini kullanarak veya tarafından' . daha detaylar için InnerException bakınız " (System.ServiceModel.Dispatcher.NetDispatcherFaultException) İstisna İleti =" biçimlendirici bir istisna attı mesaj serisini çalışırken. parametreyi serisini çalışılırken bir hata oluştu http://tempuri.org/:taskIn. InnerException mesajı 'Hata hattı 1 pozisyon içinde 960. Eleman 'http://schemas.datacontract.org/2004/07/:returnData http' Adını için eşleştiren bir tip verileri içeren' idi: //schemas.datacontract.org/2004/07/:XactException'. Ayırıcı, bu adada eşlenen herhangi bir tür bilgisine sahip değildir. bir DataContractResolver kullanılarak göz önünde ya da bilinen türleri listesine 'XactException' ye karşılık gelen tipi ekleyin -., Örneğin, DataContractSerializer geçirilir bilinen tipte listesine eklemeden KnownTypeAttribute niteliğini kullanarak veya tarafından' . daha detaylar için InnerException bakın. ", İstisna Türü = "System.ServiceModel.Dispatcher.NetDispatcherFaultException"
+0

İstisna halinde açıklanan "KnownTypeAttribute" kullanmayı deneyin. –

+1

@Daniel - Özniteliği nereye koyayım? – user589195

+0

@ user589195: "XactException" sınıfı üzerinde varsayalım. –

cevap

79

(WSDL aracılığıyla) tüm tipler nelerdir. Herhangi bir/tüm “olmayan” türler için (int, string, DateTime, vb. Olanlar için), bu nesne özelliklerinde geri iletilebilecek olası her tür için [KnownType] özniteliği eklemeniz gerekir:

[KnownType(typeof(XactException))] 
    [KnownType(typeof(...))] 
    [KnownType(typeof(...))] 
    [DataContract] 
    public class XactTaskIn 

WCF hizmeti için WSDL oluşturur bu şekilde, veri türlerini listesine XactException eklemek bilecek ve aynı zamanda seri hale bu sınıflara aramaya bilecektir.


Side-note; İstemciniz SrvUtil, Service Reference kullanılarak oluşturulduysa veya bir şekilde WSDL'den oluşturulmuşsa, [KnownType] özniteliklerini ekledikten sonra istemciyi yeniden oluşturmanız gerekecektir!

+2

Brilliant, çok teşekkürler, bana cevap vermekten ziyade onu anladığımma yardımcı oldu :) – user589195

+0

Bir sonraki alandaki sorunlarımdan önce, bir kamusal alanım vardı, ancak bir getiri gerektiren başka sorunlar vardı. liste – TruthOf42

0

Müşteriniz XactException bir XactTaskIn değil bekliyor.

Sen değiştirmeniz gerekir XactTaskIn, bir özel durum nesnesini istemciye geri gönderebilmeniz için

Özel durum verisi dökümanınızı bırakın ve XactTaskIn sınıfınıza XactTaskIn sınıfınıza veri üyesi olarak ekleyin

+0

Merhaba Ken, cevabınız için teşekkürler - Sanırım önerdiğin şeyi yapmaya çalışıyorum. İstemciye bir XactException göndermeye çalışmıyorum, bunun yerine returnData datamember bir XactException nesnesi içeren bir XactTaskIn nesnesi. – user589195

0

Veriler değiştiğinde, örneğin alanın adını awesomeString ile awesomeSTring arasında değiştirmek gibi seriliazasyon istisnaları, serileştirme işleminin kesintiye uğramasına neden olur. Bunun nedeni, yeni verilerin eski verilere karşı artık doğrulanamamasıdır. Bu düzeltme, sunucunun/istemcinin beklediği eski sürümü kullanmaktadır. o müşteri söyleyebilir böylece

 [DataMember] 
     public object[] originalInputs; 

     [DataMember] 
     public object returnData; 

WCF önde türleri muhtemelen orada ne olabilir zamanın bilmesi gerekir: Eğer nesneleri döndüren özelliklere sahip

[DataContract] 
    public class XactTaskIn 

senin sınıfında