वेब एपीआई में प्रतिक्रिया को क्रमबद्ध करने में विफल


86

मैं ASP.NET MVC वेब एपीआई पर काम कर रहा था, मुझे यह त्रुटि आ रही है:

'ObjectContent`1' प्रकार, सामग्री प्रकार 'एप्लीकेशन / xml के लिए प्रतिक्रिया निकाय को क्रमबद्ध करने में विफल रहा; charset = utf-8 '।

मेरा नियंत्रक है:

public Employee GetEmployees()
{
    Employee employees = db.Employees.First();
    return employees;
}

मुझे यह त्रुटि क्यों हो रही है?


6
आप जो अपवाद देख रहे हैं वह एक सामान्य अपवाद है, जो किसी भी कारण से हो सकता है। InnerExceptionक्रमांकन अपवाद की संपत्ति की जाँच करें कि क्या वास्तव में क्रमांकन विफल होने का कारण है।
डिस्प्ले नेम

क्या आप अपने कर्मचारी प्रकार के लिए कोड साझा कर सकते हैं? ऐसा इसलिए हो सकता है क्योंकि कर्मचारी कर्मचारी क्रमबद्ध नहीं है ...
मैगी यिंग

इसके अलावा इस stackoverflow.com/questions/8173524/…
sttaq

जवाबों:


121

मेरे लिए यह परिपत्र संदर्भ के साथ एक समस्या थी।

स्वीकृत उत्तर मेरे लिए काम नहीं करता था क्योंकि यह केवल JSON फॉर्मैटर के व्यवहार को बदल देता है, लेकिन मुझे XML मिल रहा था जब मैंने ब्राउज़र से सेवा को कॉल किया।

इसे ठीक करने के लिए, मैंने XML को स्विच किया और केवल JSON को वापस जाने के लिए मजबूर किया।

Global.asax फ़ाइल में, अपने Application_Start विधि के शीर्ष पर निम्न पंक्तियाँ डालें:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

अब केवल JSON परिणाम लौटाए जाएंगे। यदि आपको XML परिणामों की आवश्यकता है, तो आपको एक अलग समाधान खोजने की आवश्यकता होगी।


मेरे लिए काम किया। लेकिन बात यह है कि मैं POSTMAN का उपयोग कर रहा हूं। यह एक क्रोम एक्सटेंशन है। जब मैं POSTMAN के साथ डेटा पोस्ट करता हूं तो यह ठीक काम करता है। लेकिन जब मैं restsharp का उपयोग करता हूं तो यह मुझे यह त्रुटि देता है। वैसे भी आपके समाधान ने मेरी समस्या तय कर दी
ArgeKumandan

यह उत्तर xml का उपयोग करने के लिए एक समाधान प्रदान नहीं करता है, और यही उसने पूछा है।
इमानदारी

मेरे लिए काम करता है जैसा कि मैंने xml से json पर स्विच किया।
सिकाई

दरअसल, यह जवाब समस्या की जड़ तक पहुंच जाता है। मुझे प्राप्त हुई पहली त्रुटि एक परिपत्र संदर्भ त्रुटि थी (JVC को MVC नियंत्रक से वापस करने की कोशिश)। जब मुझे एपीआई विरासत में मिली नियंत्रक पर स्विच किया गया, तो मुझे इसके बजाय यह त्रुटि मिलनी शुरू हो गई। जब मैंने Global.asax के ऊपर कोड जोड़ा तो त्रुटि दूर हो गई।
मैथ्यू पिट्स

43

अपने Global.asax फ़ाइल में, Application_start () विधि में इस पंक्ति को जोड़ें:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

मुझे उम्मीद है कि उससे आप मदद मिलती है!


3
एप्लिकेशन_स्टार्ट क्या है और इसे कहां पाया जा सकता है? और वास्तव में इस लाइन को कहां रखा जाना चाहिए?
सियारन गलाघेर

4
क्षमा करें लेकिन इस कथन का अर्थ क्या है?
Blaise

5
लाइन को जोड़ा गया Global.asaxहै Application_Start, लेकिन कोई परिवर्तन नहीं।
चीजस

8
यह अभी भी मेरे लिए काम नहीं किया। हालाँकि मैंने इस उत्तर में एक के बाद एक और लाइन जोड़ी और इसने काम किया: GlobalConfiguration.Configuration.Formatters.Remove (GlobalConfiguration.Configuration.Formatters.XmlFormatter); मैंने नीचे एक और पूर्ण उत्तर बनाया है
ज़ैन

2
यह उत्तर स्वीकार नहीं किया जाना चाहिए क्योंकि यह वास्तव में XmlSerializer के साथ परिपत्र संदर्भ की समस्या को संबोधित करने के बजाय XmlSerializer को हटा देता है।
Believe2014

29

मुझे भी यही समस्या हुई। और मैंने इसे हल किया। मैंने डिफॉल्ट कंस्ट्रक्टर को डीटीओ क्लास में डाल दिया।

उदाहरण के लिए:

public class User
{
    public User()
    {
    }
}

आशा है कि यह आपके साथ काम करेगा!


सुझाव के लिए धन्यवाद, इससे मुझे xml प्रतिक्रिया में मदद मिली, लेकिन क्या किसी को पता है कि इसे डिफ़ॉल्ट निर्माता की आवश्यकता क्यों है? हमारे पास पहले से ही डेटा है ...
इल्या चेर्नोमॉर्डिक

मुझे लगता है कि जब किसी ऑब्जेक्ट को प्रतिक्रिया से अनुक्रमित किया जाता है, तो पहले निर्माता को ऑब्जेक्ट की आवृत्ति बनाने के लिए बुलाया गया था, उसके बाद, सेट विधि का उपयोग ऑब्जेक्ट को इंस्टेंस पर सेट करने के लिए किया जाता है। ऐसा मेरा अनुमान है।
taynguyen

यह वास्तव में चुना हुआ उत्तर होना चाहिए क्योंकि यह आपके लिए आवश्यक रिटर्न प्रकारों के बारे में कोई धारणा नहीं बनाता है। यह XML और JSON दोनों के लिए काम करेगा। इसे पोस्ट करने के लिए धन्यवाद।
एलन अंडरवुड

22

इसे कंस्ट्रक्टर में डालें। आशा है कि यह समस्या को हल करेगा:

    public MyController()
    {

        db.Configuration.ProxyCreationEnabled = false;
    }

उत्कृष्ट समाधान। मुझे इसे कंस्ट्रक्टर में डालने की जरूरत है और यह काम कर गया।
इनस्पेरो

इसने GlobalConfiguration सेटिंग के संयोजन में मेरे लिए काम किया। लेकिन यह काम क्यों करता है? कैसे इस समस्या को हल करता है के रूप में कोई स्पष्टीकरण? और वास्तव में समस्या क्या थी?
सियारन गलाघेर २०

यह समझने के लिए कि कौन-सी इकाई सम्‍भावनाएँ हैं: msdn.microsoft.com/en-us/library/jj592886(v=vs.113).aspx यह समझने के लिए कि ProxyCreationEnabled क्या है: stackoverflow.com/estestions/7111109/…
सज्जाद ख़ाज़ी

16

मुझे इसके दो समाधान मिले। लागू करने के लिए पहला और सबसे आसान है किसी भी IEnumerables, ICollections को एक प्रकार की सूची में बदलना। WebAPI इस ऑब्जेक्ट को अनुक्रमित कर सकता है, लेकिन यह इंटरफ़ेस प्रकारों को अनुक्रमित नहीं कर सकता है।

public class Store
{

  [StringLength(5)]
    public string Zip5 { get; set; }

    public virtual List<StoreReport> StoreReports { get; set; }  //use a list here
 }

अन्य विकल्प देशी JSON धारावाहिक का उपयोग नहीं करना है और WebApi कॉन्फ़िग के रजिस्टर विधि में इस ओवरराइड को चलाना है:

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);

1
मेरे लिए काम करते हुए सूची में बदलाव करने से मेरे लिए एक पैरामीटर रहित निर्माणकर्ता भी
जुड़ गया

8

समाधान सरल है।

LINQ क्वेरी के बाद .ToList () (या यदि जरूरत हो तो टॉडल)।

यह डेटा के आलसी लोडिंग की तुलना में उत्सुक लोडिंग करेगा


1
एक्शन रिटर्न टाइप को बदलना और रिटर्न में IENumerableजोड़ना .TiList()मेरे लिए काम कर गया।
रिकार्डो सूजा

5

** यह बग ग्राहक की ओर से अनुरोध वेब एपी / wcf / ... से कॉल करते समय होता है, लेकिन साइड इफेक्ट के रूप में, आपको कीवर्ड शामिल करके निर्भर संबंधों को शामिल करना होगा। **

public CustomerPortalContext()
            : base("Name=CustomerPortalContext")
        {
            base.Configuration.ProxyCreationEnabled = false;
        }

4

अगर आप Global.asax पर नीचे दिए गए कोड को जोड़ने के अलावा EF के साथ काम कर रहे हैं

            GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);          

आयात करना न भूलें

using System.Data.Entity;

फिर आप अपने खुद के ईएफ मॉडल वापस कर सकते हैं



3

यदि आप एंटिटी फ्रेमवर्क के साथ वेब एप का उपयोग करते हैं, तो एक समाधान हो सकता है JSON के साथ वेब एपीआई में प्रतिक्रिया को अनुक्रमित करने के लिए विफल

मूल रूप से, आपको प्रत्येक ईएफ मॉडल के अनुरूप एक मॉडल बनाने की आवश्यकता है, यह कक्षाओं के बीच निर्भरता को दूर करता है और आसान क्रमांकन की अनुमति देता है।

कोड: (संदर्भित लिंक से लिया गया)

एक UserModel बनाएँ

public class UserModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

मेरा तरीका बदलें GetAll ()

public IEnumerable<UserModel> GetAll()
{
    using (Database db = new Database ())
    {
        List<UserModel> listOfUsers = new List<UserModel>();
        UserModel userModel = new UserModel();
        foreach(var user in db.Users)
        {
           userModel.FirstName = user.FirstName;
           userModel.LastName = user.LastName;
           listOfUsers.Add(userModel);
        }
        IEnumerable<UserModel> users = listOfUsers;

        return users;
    }
}

2

डिफ़ॉल्ट इकाई 6 अपने प्रोजेक्ट में एक्सिस का उपयोग करने के लिए XML का उपयोग करें, फ़ाइल "Global.asax" फ़ाइल ढूंढें और इस लाइन को जोड़ें:

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

यह लाइन XML फॉर्मैटर को हटा देती है।


नमस्कार, वेब एपीआई XML और JSON में प्रतिक्रिया को क्रमबद्ध करता है, यदि आप हेडर जोड़ते हैं कंटेंट-टाइप: एप्लिकेशन / जसन, प्रतिक्रिया JSON में है, तो आपको इस हेडर को परिभाषित करने की आवश्यकता है, ब्राउज़र में हमेशा आप इसे XML प्रारूप
रॉबर्ट रॉबर्ट सोल के

1

लेकिन अगर आपको अन्य संस्थाओं / वर्गों के साथ यह समस्या मिली, तो आपको प्रत्येक वर्ग के लिए एक नया डीटीओ बनाना होगा, और यदि आपके पास उनमें से बहुत कुछ है, तो आप एक समस्या पा सकते हैं, मुझे भी लगता है कि इस समस्या को हल करने के लिए केवल एक डीटीओ बनाएं। कोई सबसे अच्छा तरीका नहीं है ...

क्या आपने यह कोशिश की?

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
Newtonsoft.Json.PreserveReferencesHandling.All;

सादर


1

हम्म, निम्नलिखित मदद कर सकता है।

मुझे एक ही अपवाद मिल रहा था, और मेरे मामले में मैं पहले इकाई कोड के लिए बनाई गई वास्तविक पोको इकाई को पारित कर रहा था। चूंकि, इसमें अन्य संस्थाओं के साथ संबंध हैं, इसलिए मैंने इसे वापस करने के लिए व्यूपर / डोटो इकाई बनाई।

यह अब ठीक काम करता है।

पोको इकाई:

public class Tag
{
public int Id{get;set;}
public string Title{get;set;}
public IList<Location> Locations{get;set;}
}

ViewMapper / Dto

public class TagResultsViewMapper
{
public int Id{get;set;}
public string Title{get;set;}
//just remove the following relationship 
//public IList<Location> Locations{get;set;}
}

0

आपका प्रश्न मेरे लिए काफी समान है। आपको डेटाबेस से सीधे डेटा वापस नहीं करना चाहिए। इसके लिए, आपको मॉडल और सहयोगी डेटा बनाना होगा जिसे आप दिखाना चाहते हैं।

मेरे उदाहरण में, उपयोगकर्ता के बारे में डेटा हैं जो Json क्रमबद्ध नहीं कर सकते हैं, मैंने एक userModel बनाया था और, मेरे API में, मैं डेटाबेस से उपयोगकर्ता के बजाय userModel लौटाता हूं।

उपयोगकर्ता और UserModel के बीच कनवर्ट या सहयोगी डेटा का तर्क एपीआई में होना चाहिए।

Json के साथ वेब एपीआई में प्रतिक्रिया को क्रमबद्ध करने में विफल


0

यह वह विशिष्ट त्रुटि थी जो मुझे अपने ओटाटा वेब एपीआई कॉल से वापस मिल रही थी:

The 'ObjectContent`1' type failed to serialize the response 
body for content type 'application/json; odata.metadata=minimal'.

मुझे अंत में पता चला कि मेरी dbContext क्लास में खराब फॉर्मेट की गई टेबल का नाम onModelCreating में सौंपा जा रहा था .. इसलिए SqlClient एक टेबल की तलाश में मर रही थी जो मेरे db में मौजूद नहीं थी !!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.