2012-09-28 13 views
7

में सेवा योग्य नहीं है मैंने पहले एंटिटी फ्रेमवर्क कोड को धाराप्रवाह एपीआई के साथ बनाया है।एंटिटी फ्रेमवर्क मेरे वेबएपीआई एमवीसी 4 समाधान

इस एक्सएमएल फ़ाइल इससे जुड़ी किसी भी शैली में जानकारी है प्रतीत नहीं होता है: अगर मैं एक प्राप्त अनुरोध मैं कोई त्रुटि मिलती बनाने

public class NewsController : ApiController 
{ 
    private TrafficTheoryContext db = new TrafficTheoryContext(); 

    // GET api/News 
    public IEnumerable<News> GetNews() 
    { 
     //return new List<News> { 
     // new News{ Title = "Featuring Azure ACS Authentication", Subtile="Hello "}}; 
     return db.News.AsEnumerable(); 
    } 
} 

:

मैं एक वेब एपीआई नियंत्रक की है। दस्तावेज़ पेड़ नीचे दिखाया गया है।

<Error> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'. 
</ExceptionMessage> 
<ExceptionType>System.InvalidOperationException</ExceptionType> 
<StackTrace/> 
<InnerException> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
Type 'System.Data.Entity.DynamicProxies.News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C' with data contract name 'News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C: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. 
</ExceptionMessage> 
<ExceptionType> 
System.Runtime.Serialization.SerializationException 
</ExceptionType> 
<StackTrace> 
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle) at WriteArrayOfNewsToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract) at System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) at System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c__DisplayClass7.<WriteToStreamAsync>b__6() at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token) 
</StackTrace> 
</InnerException> 
</Error> 

यदि मैं सिर्फ समाचार की एक सूची लौटाता हूं तो यह जुर्माना काम करता है। मैंने देखा कि क्लॉज किसी प्रकार के नाम से जुड़ा हुआ है जो मुझे नहीं पता कि क्या है?

वेबपाई को काम करने के लिए मैं क्या करूँ?

उत्तर

4

मुझे विश्वास है कि आप क्योंकि आपके संस्थाओं के लिए उत्पन्न गतिशील प्रॉक्सी के इस अपवाद मिलता है। आप अपवाद संदेश को देखें, तो आप वास्तव में समाचार प्रकार लेकिन System.Data.Entity.DynamicProxies.News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C प्रकार क्रमानुसार नहीं है। इस प्रकार को आलसी लोडिंग का समर्थन करने के लिए एंटिटी फ्रेमवर्क द्वारा आपके लिए बनाया गया था। आप यहाँ गतिशील प्रॉक्सी के बारे में अधिक जानकारी प्राप्त कर सकते हैं: http://msdn.microsoft.com/en-US/data/jj592886। मैं बहुत अच्छी तरह से वेबएपीआई पता नहीं है लेकिन अपवाद वास्तव में क्या के लिए किया जाना करने की जरूरत है कहते हैं: 'News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C डेटा अनुबंध नाम के साथ

प्रकार' System.Data.Entity.DynamicProxies.News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C ': http: // स्कीमा। datacontract.org/2004/07/System.Data.Entity.DynamicProxies ' की उम्मीद नहीं है। एक DataContractResolver उपयोग पर विचार करें या नहीं जाना जाता है प्रकार की सूची को स्थिर में जाना जाता है किसी भी प्रकार जोड़ने - उदाहरण के लिए, KnownTypeAttribute विशेषता का उपयोग करके या उन्हें DataContractSerializer के लिए पारित किया जाना जाता प्रकारों की सूची में शामिल करके।

के बाद प्रकार बनाई गई है स्वचालित रूप से आप विशेषता नहीं डाल सकते हैं। इसलिए मैं "डेटाकंट्रैक्ट रीसोलवर का उपयोग करने पर विचार करें" और "उन्हें डेटाकंट्रैक्टसेरियलाइज़र को पास ज्ञात ज्ञात प्रकारों की सूची में जोड़ना" पर ध्यान केंद्रित करूंगा।

बीटीडब्ल्यू आप किस ईएफ का उपयोग कर रहे हैं? मुझे लगता है कि मैंने पहले इस मुद्दे को देखा और यह ईएफ 5 आरटीएम में तय किया गया था।

+0

मैं का उपयोग करता है: \ EntityFramework.5.0.0 \ lib \ net40 \ EntityFramework.dll और हाँ आलसी अक्षम और proxi समस्या हल हो जाती है, लेकिन नहीं यकीन है कि अगर thats एक अच्छा विचार im? –

+0

मुझे नहीं पता कि DataContractResolver क्या है, इसे Google करेगा। –

+0

आलसी लोडिंग (या प्रॉक्सी सृजन) को अक्षम करना - यह निर्भर करता है कि आपका एप्लिकेशन इसका उपयोग कर रहा है या नहीं। यदि ऐसा है तो यदि आप नेविगेशन प्रॉपर्टी को स्वचालित रूप से लोड होने की उम्मीद करते हैं तो यह ऐप क्रैश हो जाएगा और यह नहीं होगा (क्योंकि प्रॉक्सी सृजन अक्षम किया गया था) – Pawel

0
.AsEnumerable के बजाय

, का उपयोग .ToList()। मैं भी उत्सुक हूं कि आप अपने डेटा संदर्भ को कैसे बना रहे हैं और नष्ट कर रहे हैं।

+0

मैंने अभी निजी ट्रैफिकथीरी कॉन्टेक्स्ट डीबी = नया ट्रैफिक थ्योरी कॉन्टेक्स्ट() रखा है; नियंत्रक वर्ग में। .अनुमेबल काम ठीक है - मुझे पता चला कि lazyloading और प्रॉक्सी अक्षम यह काम करता है। क्या यह एक बुरा विचार है? –

+1

@ s093294 - ठीक है, इसे अक्षम करके आप ईएफ की कार्यक्षमता का अपंग हिस्सा हैं। इसका मतलब है कि आपको स्पष्ट रूप से आवश्यकता है। शामिल करें() सभी टेबल जो आप उपयोग करना चाहते हैं। कुछ ऐसे लोग, दूसरों को नहीं। इसके अलावा, कोई प्रॉक्सी पीढ़ी का मतलब कोई परिवर्तन ट्रैकिंग नहीं है, और संदर्भ के राज्य को सिंक्रनाइज़ करने में ट्रैकिंग बदलना बहुत महत्वपूर्ण है। यदि आप प्रॉक्सी सृजन को अक्षम करते हैं, तो आपको रिकॉर्ड को सम्मिलित करने, अपडेट करने या हटाने के बारे में बहुत सावधान रहना होगा। –

+0

ठीक है, toList() का उपयोग करके या तो काम नहीं किया, यह सिर्फ प्रॉक्सी की एक सूची है। –

4

मैं अपने Mcv5 परियोजना में एक ही समस्या का सामना करना पड़ रहा था जब मैं प्रॉक्सी निर्माण हर चीज charm.I आशा की तरह काम कर रहा है को निष्क्रिय यह भी आप में मदद मिलेगी।

DbContext.Configuration.ProxyCreationEnabled = false; 
संबंधित मुद्दे