2009-08-18 11 views
6

मैं एक वस्तु है कि एक WCF वेब सेवा विधि से लौटे किया जा रहा है उस में एक सामान्य IList है हैWCF IList क्रमबद्धता जारी करना

[DataContract(Name = "PageableList_Of_{0}")] 
public class PageableResults<T> 
{ 
    [DataMember] 
    public IList<T> Items { get; set; } 
    [DataMember] 
    public int TotalRows { get; set; } 
} 

[OperationContract] 
PageableResults<ContentItem> ListCI(); 

जब मैं सेवा पर इस विधि कॉल यह पूरे विधि ठीक कार्यान्वित , लेकिन बहुत अंत में यह एक सिस्टम फेंकता है। एक्सेक्यूशनइंजिन अपवाद बिना किसी इंजेक्शन के। मैंने कंक्रीट सूची <> ऑब्जेक्ट को वापस करने का प्रयास किया है और यह काम करता प्रतीत होता है, लेकिन दुर्भाग्य से मुझे एक आईएलआईस्ट वापस करने के लिए एक कामकाज खोजने की जरूरत है। क्या इसे हल करने के लिए मुझे कोई विशेषता है?

+0

आप कहते हैं, "जब मैं सेवा पर इस विधि को कॉल करता हूं" - क्या त्रुटि वास्तव में परिणाम को deserializing है? –

+0

मुझे लगता है कि यह सेवा पक्ष में हो रहा है जब यह ऑब्जेक्ट को क्रमबद्ध करने के लिए जाता है क्योंकि यह सेवा विधि से बाहर निकलने पर सही होता है, लेकिन अपवाद में कोई स्टैक ट्रेस नहीं है इसलिए मैं सकारात्मक नहीं हो सकता। – Nick

उत्तर

1

आप टी से प्रत्येक उपयोग इस तरह के लिए अपनी कक्षा परिभाषा ऊपर जोड़ने के लिए वर्ग परिभाषा पर KnownTypes विशेषता होगा:


[KnownType(typeof(ContentItem))] 
[DataContract(Name = "PageableList_Of_{0}")] 
public class PageableResults<T> 
{ 
    [DataMember] 
    public IList<T> Items { get; set; } 
    [DataMember] 
    public int TotalRows { get; set; } 
} 

[OperationContract] 
PageableResults ListCI(); 

वैकल्पिक रूप से आप अपने खुद के संग्रह वर्ग को परिभाषित कर सकते हैं, एक TotalRows संपत्ति है , इस तरह:


[KnownType(typeof(ContentItem))] 
[DataContract(Name = "PageableList_Of_{0}")] 
public class PageableResults<T> : EntityCollectionWorkaround<T> 
{ 
    [DataMember] 
    public int TotalRows { get; set; } 
} 

कहाँ EntityCollectionWorkaround यहाँ परिभाषित किया गया है:
http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html

1

मुझे नहीं लगता कि आप यह कर सकते हैं। धारावाहिक को कैसे पता चलेगा कि क्या करना चाहिए? कई चीजें एक आईएलआईस्ट को लागू कर सकती हैं, और एक इंटरफ़ेस में कोई कन्स्ट्रक्टर नहीं होता है।

+0

नेट टीसीपी बाइंडिंग का उपयोग करते समय यह ठीक काम करता प्रतीत होता है, लेकिन WSHttp बाइंडिंग – Nick

+0

के साथ नहीं, अंतर्निहित प्रकार क्या है जिसके बाद यह deserializing है? मैं नहीं देखता कि यह कैसे काम कर सकता है जब तक कि यह केवल एक कंटेनर को यादृच्छिक रूप से नहीं उठाता है जो IList लागू करता है और उन्हें वहां चिपकाता है। – Steve

1

ऐसा लगता है कि इस WCF में एक बग, जो नेट 4 में तय हो गई है फिर भी है, कई इस सूत्र में सूचीबद्ध समाधान देखते हैं:
http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=433569

सारांश:
- विधानसभाओं कि शामिल रखो जीएसी में डाटाकंट्रैक्ट्स।
- लोडर ऑप्टिमाइज़ेशन को सिंगलडोमेन पर सेट करें।

0

पेजेबल रीसेट्स से एक बंद जेनेरिक सबक्लास बनाने के लिए, अपने मामले में पेजेबल कंटेंट इटैम या ऐसा कुछ, और इसे रिटर्न प्रकार के रूप में उपयोग करें। वेब सर्विसेज के साथ आमतौर पर एक्सएमएल सीरिएलाइज़र का उपयोग किया जाता है और इसे पहले से ही सब कुछ पता होना चाहिए, यही कारण है कि आप इंटरफ़ेस प्रकार भी वापस नहीं कर सकते हैं।

public class PageableContentItem 
     : PageableResults<ContentItem> 
    { 

    } 

[OperationContract] 
PageableContentItem ListCI();