5

से एक खाली 500 http स्टेटस कोड प्राप्त करना मेरे मॉडल में एक गोलाकार ऑब्जेक्ट ग्राफ़ है, लेकिन यह अपरिहार्य है।वेब एपीआई

this article में दी गई सलाह के अनुसार, मैंने DataContractAttribute का उपयोग किया है और सभी सदस्यों पर IsReference = true सेट किया है। मैंने उन सभी गुणों पर DataMemberAttribute भी प्रदान किया है जिन्हें मैं क्रमबद्ध करना चाहता हूं।

यह सुनिश्चित करने के लिए कि धारावाहिक को फिर से कोई समस्या नहीं आती है, मैंने केवल को नेविगेशन गुणों को क्रमबद्ध करने के लिए चुना है।

हालांकि, मुझे अभी भी मेरे कैच ब्लॉक में अपवाद का सामना करना पड़ रहा है। अपवाद के विवरण इस प्रकार हैं:

 _innerException: {"Type 
'System.Data.Entity.DynamicProxies.Author_615FB9F8BB22B55A7CA168DA5ED29EC6A0B59F62FD79D1346045351BE2F163A4' with data contract name 
    'Author_615FB9F8BB22B55A7CA168DA5ED29EC6A0B59F62FD79D1346045351BE2F163A4: 
http://schemas.datacontract 
    .org/2004/07/System.Data.Entity.DynamicProxies' is not expected. 
Consider using a 
    DataContractResolver or add any types not known statically to 
the list of known types - for 
    example, by using the KnownTypeAttribute attribute or by adding them 
to the list of known types 
    passed to DataContractSerializer."} 

मैं कर सकता लेकिन नहीं करना चाहते हैं:

1) प्रॉक्सी निर्माण अक्षम करें। मैं केवल क्रमबद्धता के लिए प्रॉक्सी निर्माण को हटा सकता हूं, जो मैं कर सकता हूं। लेकिन मैं यह भी जानना चाहता हूं कि मुझे अभी भी अपवाद क्यों मिल रहा है और मैं इसके बारे में क्या कर सकता हूं।

2) परिपत्र संदर्भ हटाएं। कारण: एंटीटी फ्रेमवर्क जेनरेट मॉडल में इन प्रकार के संदर्भ बहुत आम हैं। अगर मैं मॉडल में 800 से 1000 कक्षाओं के साथ एक बड़ी परियोजना कर रहा था, तो यह परिपत्र संदर्भों को हटाकर इसे लागू करने के लिए एक दुःस्वप्न हो सकता है।

मैंने नीचे इस छोटे स्पाइक समाधान के स्थापत्य तत्वों का वर्णन किया है।

डाटाबेस स्कीमा

Id AuthorName 
------------------------------- 
1 Charles Dickens 
2 Charles Petzold 
3 Charles Darwin 
4 Charles Chaplin 
5 Leo Tolstoy 
6 Fydor Dostoevsky 
7 Ayn Rand 
8 Napolean Hill 
9 Claude M. Bristol 
10 Edward Dwight Easty 
11 O. Henry 
12 William Shakespeare 
13 Juwal Lowy 
14 Jeffrey Richter 
15 Chris Sells 
16 Don Box 
17 Steven Pinker 
18 Jim Rohn 
19 George Eliot 
20 Sathyaish Chakravarthy 



Id   Title            AuthorId 
----------- -------------------------------------------------- ----------- 
1   Nicholas Nickleby         1 


Id   BookId  Review 
----------- --------------------------------------------------------------- 
1   1   How do I know? I haven't read it. 

मॉडल

using System.Collections.Generic; 
using System.Runtime.Serialization; 

namespace BookReviewsModel 
{ 
    [DataContract(IsReference = true)] 
    public partial class Author 
    { 
     [DataMember] 
     public virtual int Id { get; set; } 

     [DataMember] 
     public virtual string AuthorName { get; set; } 

     public virtual ICollection<Book> Books { get; set; } 
    } 
} 


namespace BookReviewsModel 
{ 
    [DataContract(IsReference = true)] 
    public partial class Book 
    { 
     [DataMember] 
     public virtual int Id { get; set; } 

     [DataMember] 
     public virtual string Title { get; set; } 

     [DataMember] 
     public virtual int AuthorId { get; set; } 

     public virtual Author Author { get; set; } 

     public virtual ICollection<BookReview> BookReviews { get; set; } 
    } 
} 

namespace BookReviewsModel 
{ 
    [DataContract(IsReference = true)] 
    public partial class BookReview 
    { 
     [DataMember] 
     public virtual int Id { get; set; } 

     [DataMember] 
     public virtual int BookId { get; set; } 

     [DataMember] 
     [AllowHtml] 
     public virtual string Review { get; set; } 

     public virtual Book Book { get; set; } 
    } 
} 

नियंत्रक कोड

namespace BookReviews.Controllers 
{ 
    public class AuthorController : ApiController 
    { 
     [HttpGet] 
     public IEnumerable<Author> Index() 
     { 
      try 
      { 
       using (var context = new BookReviewEntities()) 
       { 
        var authors = context.Authors.ToList(); 

        var str = Serialize(new XmlMediaTypeFormatter(), authors); 

        System.Diagnostics.Debugger.Break(); 
        System.Diagnostics.Debug.Print(str); 

        return authors; 
       } 
      } 
      catch (Exception ex) 
      { 
       var responseMessage = new HttpResponseMessage 
       { 
        Content = new StringContent("Couldn't retreive the list of authors."), 
        ReasonPhrase = ex.Message.Replace('\n', ' ') 
       }; 

       throw new HttpResponseException(responseMessage); 
      } 
     } 

     string Serialize<T>(MediaTypeFormatter formatter, T value) 
     { 
      Stream stream = new MemoryStream(); 
      var content = new StreamContent(stream); 

      formatter.WriteToStreamAsync(typeof(T), value, stream, content, null).Wait(); 

      stream.Position = 0; 
      return content.ReadAsStringAsync().Result; 
     } 
    } 
} 
+0

अपने सभी वर्गों आंशिक कर रहे हैं - कि कोई अन्य समस्याएं पैदा कर सकता है? क्या कक्षाओं के अन्य हिस्सों को भी विशेषता के साथ चिह्नित किया गया है या यह आवश्यक नहीं है? –

+0

मैं पुष्टि कर सकता हूं कि यह आंशिक कक्षाओं के बिना होता है, हालांकि, मेरे मामले में मूल कारण वर्चुअल नेविगेशन प्रॉपर्टी का उपयोग होता है (क्रमबद्धता के लिए चिह्नित नहीं)। डब्ल्यूसीएफ सेवाओं के लिए उपलब्ध प्रॉक्सीडाटा कंट्रैक्ट रेसोलवर + IObjectBehavior समाधान के समान के लिए एक साफ कामकाज होना आवश्यक है। –

+0

क्या आपने इसे देखने का प्रयास किया है: http://stackoverflow.com/questions/11851207/prevent-property-from-being-serialized-in-web-api या यह एक http://stackoverflow.com/questions/1411577/ अनदेखा-ए-फील्ड-दौरान-नेट-जेसन-सीरियलाइजेशन-समान-से-xmlignore –

उत्तर

2

समाधान:

यह समस्या AspNetWebStack रात बिल्ड में हल हो गई है।

मैंने ट्रैक नहीं किया है कि चेक-इन व्यवहार को सुधारता है क्योंकि मैं कई मुद्दों पर अनुसरण कर रहा हूं।

आप अपने पैकेज प्रबंधक कॉन्फ़िगरेशन में http://www.myget.org/F/aspnetwebstacknightly/ जोड़ कर नवीनतम रात के पैकेज का उपयोग करने के लिए अपना समाधान अपडेट कर सकते हैं और फिर स्पष्ट रूप से इस अतिरिक्त भंडार से अपडेट कर सकते हैं।

जहां तक ​​मेरा बता सकते हैं, 1/18 हर रात को मेरी समाधान के भीतर स्थिर है (OData प्रश्नों ज्यादा तेजी के साथ-साथ लौट आते हैं।)

वर्कअराउंड:

आप उपयोग नहीं कर सकते नवीनतम aspnetwebstack बनाता है, यदि आपको एक्सएमएल स्वरूपित फ़ीड की आवश्यकता नहीं है तो एक संभावित समाधान है।

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization

यह दस्तावेज़ वेब-api नियंत्रकों द्वारा प्रयोग किया जाता formatters कॉन्फ़िगर कैसे पता चलता है, यह भी वृत्तीय संदर्भ के साथ सौदा करने के लिए कैसे, और पुन: कॉन्फ़िगर करने के लिए कैसे/डिफ़ॉल्ट एक्सएमएल फ़ॉर्मेटर की जगह को दर्शाता है।

एक समाधान आप Application_Start दौरान एक्सएमएल फ़ॉर्मेटर निकाल सकते हैं के रूप में:

var xmlFormatter = config.Formatters.XmlFormatter; 
if (xmlFormatter != null) 
{ 
    config.Formatters.Remove(xmlFormatter); 
} 
0

मैं नहीं जानता कि WebAP मैं बहुत अच्छी तरह से, लेकिन ProxyDataContractResolver का उपयोग करके आप डब्ल्यूसीएफ में एक ही समस्या को हल करते हैं। उम्मीद है कि वेबएपीआई में एक समान हुक है?

+0

यह एपीकंट्रोलर पर लागू नहीं होता है वैसे ही यह डब्ल्यूसीएफ सेवाएं करता है (अभी परीक्षण किया गया है।) –

संबंधित मुद्दे