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


109

मैं ASP.NET MVC 5 वेब एपी के साथ काम कर रहा हूं। मैं अपने सभी उपयोगकर्ताओं से परामर्श करना चाहता हूं।

मैंने लिखा api/usersऔर मुझे यह प्राप्त हुआ:

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

WebApiConfig में, पहले ही मैंने ये पंक्तियाँ जोड़ दी हैं:

HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

लेकिन यह अभी भी काम नहीं करता है।

रिटर्न डेटा के लिए मेरा कार्य यह है:

public IEnumerable<User> GetAll()
{
    using (Database db = new Database())
    {
        return db.Users.ToList();
    }
}

मान ऑब्जेक्ट क्या दिखता है जो आप उपभोक्ता को पास करने की कोशिश कर रहे हैं?
mckeejm

बहुत बहुत धन्यवाद! बस फी - मुझे लगता है कि पढ़ना चाहिए: (डेटाबेस डीबी = नया डेटाबेस ()) {सूची <UserModel> listOfUsers = नई सूची <UserModel> (); foreach (db.Users में var उपयोगकर्ता) {UserModel userModel = new UserModel (); userModel.FirstName = user.FirstName; userModel.LastName = user.LastName; listOfUsers.Add (userModel); } IEnumerable <UserModel> उपयोगकर्ता = listOfUsers; उपयोगकर्ताओं को वापस करें; } ..तो परिणाम सभी एक ही मूल्यों पर लौट रहे थे।
जेरेड व्हिटिंगटन

जवाबों:


76

जब वेब एपी (या उस मामले के लिए कोई अन्य वेब सेवा) से उपभोक्ता को डेटा वापस करने की बात आती है, तो मैं अत्यधिक डेटाबेस से आने वाली संस्थाओं को पारित नहीं करने की सलाह देता हूं। यह उन मॉडलों का उपयोग करने के लिए बहुत अधिक विश्वसनीय और बनाए रखने योग्य है जिसमें आपके पास नियंत्रण है कि डेटा कैसा दिखता है और डेटाबेस नहीं। इस तरह से आपको WebApiConfig में फ़ॉर्मेटर्स के साथ गड़बड़ करने की ज़रूरत नहीं है। आप केवल एक UserModel बना सकते हैं जिसमें बाल मॉडल गुण के रूप में हैं और रिटर्न ऑब्जेक्ट्स में संदर्भ छोरों से छुटकारा पा सकते हैं। जिससे धारावाहिक को बहुत खुशी मिलती है।

इसके अलावा, फ़ॉर्मेटर्स या समर्थित मीडिया प्रकारों को निकालना आवश्यक नहीं है, यदि आप अनुरोध में केवल "स्वीकार" शीर्षक निर्दिष्ट कर रहे हैं। उस सामान के साथ खेलना कभी-कभी चीजों को और अधिक भ्रमित कर सकता है।

उदाहरण:

public class UserModel {
    public string Name {get;set;}
    public string Age {get;set;}
    // Other properties here that do not reference another UserModel class.
}

जब आप मॉडल का संदर्भ लेते हैं, तो आप कहते हैं कि मैं क्या कर रहा हूं? एक मॉडल है जो उपयोगकर्ताओं के IEnumerable लौटें।
कैंपडेव

5
आप एक इकाई लौटा रहे हैं। एक इकाई डीबी में एक ऑब्जेक्ट को संदर्भित करता है जिसे एक अद्वितीय आईडी द्वारा पुनर्प्राप्त किया जा सकता है। आप अपने डेटाबेस से सभी उपयोगकर्ता निकाय लौटा रहे हैं। मैं सुझाव दे रहा हूं कि आप "UserModel" नामक एक नई कक्षा बनाएँ और डेटाबेस से आपको प्राप्त होने वाली प्रत्येक उपयोगकर्ता संस्थाओं के लिए, उस डेटा मॉडल वर्ग का एक नया उदाहरण बनाएं, जिसमें आवश्यक जानकारी आप उजागर करना चाहते हैं। उपयोगकर्ता संस्थाओं के विपरीत UserModel ऑब्जेक्ट्स का IEnumerable वापसी। सुनिश्चित करें कि मॉडल गुण UserModel वर्ग के उदाहरणों को संदर्भित नहीं करते हैं। वही आपको इस समस्या में डाल रहा है।
जेन्सेंडप

3
ncampuzano सही है, आप स्वत: उत्पन्न संस्थाओं को वापस नहीं करना चाहते हैं। यदि आप डेटाबेस एक्सेस के लिए संग्रहीत कार्यविधियों का उपयोग कर रहे थे तो अलगाव अधिक स्पष्ट होगा। आपको IDataReader से मान ऑब्जेक्ट के लिए C # मान ऑब्जेक्ट और मैप किए गए मान उत्पन्न करने की आवश्यकता होगी। चूंकि आप ईएफ का उपयोग कर रहे हैं, इसलिए आपके लिए कक्षाएं उत्पन्न की जा रही हैं, लेकिन वे विशेष ईएफ कक्षाएं हैं जो अधिक जानती हैं, फिर मूल्य ऑब्जेक्ट करते हैं। आपको केवल अपने क्लाइंट को "डंबल" मान ऑब्जेक्ट वापस करना चाहिए।
mckeejm

1
@Donny यदि आप अपने नियंत्रक में DBContext या एक रिपॉजिटरी का उपयोग कर रहे हैं जो DB से संस्थाओं को वापस कर रहा है, तो आप बस नियंत्रक में मॉडल (उदाहरण के लिए एक डीटीओ) के लिए ऑब्जेक्ट मैप कर सकते हैं ... लेकिन मुझे पसंद है नियंत्रक उस सेवा को कहते हैं जो मॉडल / डीटीओ को लौटाती है। मैपिंग से निपटने के लिए AutoMapper - शानदार टूल देखें।
बेन

1
@NH। आप उपर्युक्त shenanigans का बिल्कुल उपयोग कर सकते हैं, लेकिन इसके पास सब कुछ है। डेटा लेयर तक पहुंच द्वारा प्रदान की गई "इकाइयां" आमतौर पर डेटा लेयर में रहना चाहिए। कुछ भी जो इस डेटा को एप्लिकेशन के बिजनेस लेयर के भीतर उपयोग करना चाहता है, वह आमतौर पर "इकाइयां" को रूपांतरित रूप में (डोमेन ऑब्जेक्ट्स) उपयोग करेगा। और फिर डेटा जो उपयोगकर्ता से वापस आ जाता है और इनपुट आम तौर पर एक और रूप में भी होगा (मॉडल)। सहमत थे कि इस प्रकार के परिवर्तन को हर जगह करना थकाऊ हो सकता है, लेकिन यह वह जगह है जहां AutoMapper जैसे उपकरण वास्तव में काम में आते हैं।
जेन्सेंडप

147

यदि आप 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;

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

इतना ही आसान!


भले ही यह ईएफ के लिए मदद कर सकता है, समाधान ईएफ के लिए विशिष्ट नहीं है, और अन्य प्रकार के मॉडल के साथ भी काम करते हैं। Global.asax में उपयोग आवश्यक प्रतीत नहीं होता है। क्या यह नियंत्रकों के लिए इरादा था?
मैथ्यू

16
यह कोड क्या करता है और इसके निहितार्थ का कुछ स्पष्टीकरण दिया जाएगा।
याकूब

1
धन्यवाद मैं इसी तरह की समस्या का सामना कर रहा था, इस जवाब ने मुझे इस मुद्दे को हल करने में मदद की।
RK_Aus

इससे मेरा काम बनता है। System.Data.Entity का उपयोग करके जोड़ने की आवश्यकता नहीं है; to Global.asax धन्यवाद।
डॉ। एमएएफ

यह काम करता हैं। Global.asax पर सरल जोड़ कोड, सभी को thats, System.Data.Entity का उपयोग करके आयात करने की कोई आवश्यकता नहीं है;
हेमंत रामफुल

52

सही उत्तर दिए जाने का एक तरीका है, हालांकि, यह एक ओवरकिल है जब आप इसे एक कॉन्फ़िगरेशन सेटिंग्स द्वारा ठीक कर सकते हैं।

Dbcontext कंस्ट्रक्टर में इसका उपयोग करने के लिए बेहतर है

public DbContext() // dbcontext constructor
            : base("name=ConnectionStringNameFromWebConfig")
{
     this.Configuration.LazyLoadingEnabled = false;
     this.Configuration.ProxyCreationEnabled = false;
}

Asp.Net वेब API त्रुटि: 'ObjectContent`1' प्रकार सामग्री प्रकार के लिए प्रतिक्रिया निकाय को क्रमबद्ध करने में विफल रहा 'आवेदन / xml; charset = utf-8 '


यदि हम डेटाबेस से मॉडल को अपडेट करते हैं तो आपका कोड हटा दिया जाएगा।
बिमल दास

1
आप .tt फ़ाइलों को हटाकर इसे आसानी से अलग कर सकते हैं और संदर्भ को असम्बद्ध कर सकते हैं। हर बार जब आप मॉडल जनरेट करते हैं, तो उस स्थान पर नई कक्षा जोड़ें। @Brimal: आप इसे youtube.com/watch?v=yex0Z6qwe7A
Md। आलिम उल करीम

1
ओवरराइट से बचने के लिए, आप edmx गुणों से आलसी लोड को अक्षम कर सकते हैं। इसने मेरे लिए काम किया।
फ्रांसिस्को जी

@FranciscoG यह काम करता है लेकिन अगर हम edmx को हटा दें और पुन: उत्पन्न करें तो यह खो जाता है।
मो। आलिम उल करीम

1
@BimalDas इस youtube.com/… को आज़माएं । यह नहीं निकालेगा
Md। आलिम उल करीम

37

इस कोड को global.asaxनीचे जोड़ें Application_Start:

से अपडेट .Ignoreकरें .Serialize। यह काम करना होगा।

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

1
महान धन्यवाद काम करता है !, क्या आप बेहतर समझा सकते हैं कि हमें यह काम करने के लिए Xml फॉर्मेटर को क्यों निकालना होगा?
Jav_1

Json क्रमांक जोड़ने की आवश्यकता नहीं है (कम से कम मेरे मामले में) लेकिन Xml स्वरूपण को हटाने की आवश्यकता थी। मुझे लगता है कि xml क्रमांक अनाम प्रकारों को क्रमबद्ध नहीं कर सकता है और इसे हटाकर परिणाम को json के रूप में क्रमबद्ध किया जाता है। यदि मेरा अनुमान सही है तो MIME प्रकार "एप्लिकेशन / जसन" के लिए पूछकर नियंत्रक से डेटा प्राप्त करने में सक्षम होगा।
लॉसमनोस

11
public class UserController : ApiController
{

   Database db = new Database();

   // construction
   public UserController()
   {
      // Add the following code
      // problem will be solved
      db.Configuration.ProxyCreationEnabled = false;
   }

   public IEnumerable<User> GetAll()
    {
            return db.Users.ToList();
    }
}

वाह, यह मेरे लिए काम किया। पर क्यों? ProxyCreationEnabled संपत्ति क्या करती है?
जैकट्रिक

मेरे साथ काम किया लेकिन यह कोड क्या है? मैंने यह भी उल्लेख किया है कि सभी उप वर्गों को शून्य से पुनर्प्राप्त किया गया है !!
वलीद ए। इलागल

10

मुझे यह कोड पसंद नहीं है:

foreach(var user in db.Users)

एक विकल्प के रूप में, कोई ऐसा काम कर सकता है, जिसने मेरे लिए काम किया:

var listOfUsers = db.Users.Select(r => new UserModel
                         {
                             userModel.FirstName = r.FirstName;
                             userModel.LastName = r.LastName;

                         });

return listOfUsers.ToList();

हालाँकि, मैंने लुकास रोसेली के समाधान का उपयोग किया।

अद्यतन: अनाम वस्तु को लौटाकर सरलीकृत:

var listOfUsers = db.Users.Select(r => new 
                         {
                             FirstName = r.FirstName;
                             LastName = r.LastName;
                         });

return listOfUsers.ToList();

10

मैंने इस कोड को WebApiConfig.cs फ़ाइल का उपयोग करके हल किया

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

बहुत बहुत धन्यवाद। हालांकि यह सुरक्षा के लिए क्या करता है पता नहीं है।
अरुण प्रसाद ES

6

इस परिदृश्य में भी वही त्रुटि उत्पन्न होती है:

वापसी के मामले में एक List<dynamic>वेब एपीआई विधि के लिए किया जा रहा है

उदाहरण:

public HttpResponseMessage Get()
{
    var item = new List<dynamic> { new TestClass { Name = "Ale", Age = 30 } };

    return Request.CreateResponse(HttpStatusCode.OK, item);
}

public class TestClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

तो, इस परिदृश्य के लिए वापसी वर्ग में [KnownTypeAttribute] का उपयोग करें (उन सभी को) इस तरह:

[KnownTypeAttribute(typeof(TestClass))]
public class TestClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

यह मेरे लिए काम करता है!


यदि आप गतिशील स्तंभों के साथ linq pivot का उपयोग कर रहे हैं तो क्या होगा?
कोडग्रिड

[KnownTypeAttribute (टाइपोफ़ (टेस्टक्लास))] ने मेरी समस्या हल की
रेमंड

6

इसे आपकी फ़ाइल की Application_Start()विधि में जोड़ने Global.asaxसे समस्या का समाधान होना चाहिए

protected void Application_Start()
{
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
        .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    GlobalConfiguration.Configuration.Formatters
        .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 
// ...
}

METHOD 2: [अनुशंसित नहीं]
यदि आप EntityFramework के साथ काम कर रहे हैं, तो आप अपने DbContext क्लास कंस्ट्रक्टर में प्रॉक्सी को अक्षम कर सकते हैं। नोट: यदि आप मॉडल को अपडेट करते हैं तो यह कोड wll हटा दिया जाएगा

public class MyDbContext : DbContext
{
  public MyDbContext()
  {
    this.Configuration.ProxyCreationEnabled = false;
  }
}

1
धन्यवाद सुमन मैं एक ही मुद्दा रहा था। मैं अपने वेब एपीआई का परीक्षण कर रहा था और इस मुद्दे पर अटक गया। आपका समाधान समस्या का समाधान करता है। बहुत बहुत धन्यवाद।
तारकप्रजापति

4

मेरा व्यक्तिगत पसंदीदा: बस नीचे दिए गए कोड को जोड़ने App_Start/WebApiConfig.cs। यह डिफ़ॉल्ट रूप से XML के बजाय json लौटाएगा और आपके द्वारा की गई त्रुटि को भी रोकेगा। Global.asaxहटाने XmlFormatterआदि के लिए संपादित करने की आवश्यकता नहीं है

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

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

2

AutoMapper का उपयोग करें ...

public IEnumerable<User> GetAll()
    {
        using (Database db = new Database())
        {
            var users = AutoMapper.Mapper.DynamicMap<List<User>>(db.Users);
            return users;
        }
    }

2

निम्नलिखित नामस्थान का उपयोग करें:

using System.Web.OData;

के बजाय :

using System.Web.Http.OData;

इसने मेरे लिए काम किया


2

नीचे की लाइन जोड़ें

this.Configuration.ProxyCreationEnabled = false;

के ProxyCreationEnabledरूप में उपयोग करने के लिए दो तरीके false

  1. इसे DBContextकंस्ट्रक्टर के अंदर डालें

    public ProductEntities() : base("name=ProductEntities")
    {
        this.Configuration.ProxyCreationEnabled = false;
    }

या

  1. Getविधि के अंदर लाइन जोड़ें

    public IEnumerable<Brand_Details> Get()
    {
        using (ProductEntities obj = new ProductEntities())
        {
            this.Configuration.ProxyCreationEnabled = false;
            return obj.Brand_Details.ToList();
        }
    }

2

समाधान जो मेरे लिए काम करता है:

  1. क्रमबद्ध करने के लिए प्रत्येक गुण के [DataContract]लिए वर्ग और [DataMember]विशेषताओं का उपयोग करें । यह Json परिणाम (उदा। फ़िडलर से) प्राप्त करने के लिए पर्याप्त है।

  2. Global.asaxइस कोड में xml क्रमांकन लिखने के लिए:

    var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true;

  3. इस लेख को पढ़ें, इससे मुझे क्रमांकन समझने में मदद मिली: https://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization

1

जेन्सेंडप के उत्तर में जोड़ने के लिए:

मैं उपयोगकर्ता द्वारा बनाए गए मॉडल में इकाई को पास करूंगा और आपके नए बनाए गए मॉडल में मूल्यों को सेट करने के लिए उस इकाई के मूल्यों का उपयोग करूंगा। उदाहरण के लिए:

public class UserInformation {
   public string Name { get; set; }
   public int Age { get; set; }

   public UserInformation(UserEntity user) {
      this.Name = user.name;
      this.Age = user.age;
   }
}

फिर अपना वापसी प्रकार बदलें: IEnumerable<UserInformation>


1
वहाँ बहुत आप के लिए अनुवाद को संभालने के लिए और अधिक सुरुचिपूर्ण तरीके आप हर संपत्ति को बनाए रखने की जरूरत नहीं है कि .. AutoMapper और ValueInjecter 2 उल्लेखनीय हैं कर रहे हैं
ध्वनि आत्मा

1

यह मेरी त्रुटि है

मैं मूल रूप से एक पंक्ति जोड़ता हूं जो वे हैं

  • इकाइयाँ।

UsersController.cs के लिए

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using UserDataAccess;

namespace SBPMS.Controllers
{
    public class UsersController : ApiController
    {


        public IEnumerable<User> Get() {
            using (SBPMSystemEntities entities = new SBPMSystemEntities()) {
                entities.Configuration.ProxyCreationEnabled = false;
                return entities.Users.ToList();
            }
        }
        public User Get(int id) {
            using (SBPMSystemEntities entities = new SBPMSystemEntities()) {
                entities.Configuration.ProxyCreationEnabled = false;
                return entities.Users.FirstOrDefault(e => e.user_ID == id);
            }
        }
    }
}

यहाँ मेरा उत्पादन है:


1

वर्ग के लिए [क्रमिक] का उपयोग करें:

उदाहरण:

[Serializable]
public class UserModel {
    public string Name {get;set;}
    public string Age {get;set;}
}

यह मेरे लिए काम किया!


1
इस तरह से फंसे, कोई लगभग सोच सकता है कि हर एक जो इस पोस्ट का जवाब देने से पहले गूंगा था;) ... खैर, मुझे गंभीरता से संदेह है कि वे शायद इसका मतलब यह था कि यह समाधान बस तब लागू नहीं हुआ था जब सवाल पूछा गया था, 2015 में वापस ... मैं खुद उस वाक्य रचना के बारे में ज्यादा नहीं जानता, लेकिन मुझे लगता है कि या तो यह अपेक्षाकृत नया है, या इसमें कुछ कमियां हो सकती हैं जो इसे कुछ उपयोग मामलों में अनुपयोगी बनाती हैं। मुझे लगता है कि आपका समाधान भविष्य के पाठकों तक इस सवाल को पहुंचाने के लिए उपयोगी हो सकता है, लेकिन अगर आप इसकी सीमाएँ स्पष्ट करेंगे तो यह निश्चित रूप से मदद करेगा।
jwatkins

1

आपको App_Start फ़ोल्डर में उपलब्ध WebApiConfig.cs के भीतर Serializer Formatter को परिभाषित करना होगा

Config.Formatters.Remove जोड़ना (config.Formatters.XmlFormatter); // जो आपको JSON फॉर्मेट में डेटा प्रदान करेगा

Config.Formatters.Remove जोड़ना (config.Formatters.JsonFormatter); // जो आपको XML फॉर्मेट में डेटा प्रदान करेगा


आप एक पदक के हकदार हैं।
कर्ग्रामग्राम

1

Global.asax में बस निम्नलिखित पंक्तियाँ डालें:

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

आयात

using System.Data.Entity;

0

एक अन्य मामला जहां मुझे यह त्रुटि मिली जब मेरे डेटाबेस क्वेरी ने एक अशक्त मान लौटाया था लेकिन मेरे उपयोगकर्ता / दृश्य मॉडल प्रकार को गैर-अशक्त माना गया था। उदाहरण के लिए, मेरे UserModel फ़ील्ड intको int?हल से बदल रहा है ।


0

यह तब भी होता है जब प्रतिक्रिया-प्रकार सार्वजनिक नहीं होता है! मैंने एक आंतरिक वर्ग लौटाया क्योंकि मैंने मुझे टाइप करने के लिए विज़ुअल स्टूडियो का उपयोग किया।

internal class --> public class

0

जबकि ऊपर दिए गए ये सभी उत्तर सही हैं, हो सकता है कि कोई व्यक्ति इनर एक्सेप्शन> ExceptionMessage की जांच करना चाहता हो ।

यदि यह ऐसा कुछ कहता है, "T वह ऑब्जेक्टकंटेक्स्ट उदाहरण को निपटाया गया है और अब संचालन के लिए उपयोग नहीं किया जा सकता है तो कनेक्शन की आवश्यकता होती है। " EF के डिफ़ॉल्ट व्यवहार के कारण यह एक समस्या हो सकती है।

LazyLoadingEnabled = झूठे को असाइन करके आपके DbContext कंस्ट्रक्टर को ट्रिक करेगा।

public class MyDbContext : DbContext
{
  public MyDbContext()
  {
    this.Configuration.LazyLoadingEnabled = false;
  }
}

ईएफ़रलोडिंग और ईएफ़ के लेजीलोल्डिंग व्यवहार के बारे में अधिक विस्तृत पढ़ने के लिए इस एमएसडीएन अनुच्छेद का संदर्भ लें ।


0

मेरे मामले में मुझे इसी तरह का त्रुटि संदेश मिला है:

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

लेकिन जब मैंने इसमें गहरी खुदाई की, तो मुद्दा यह था:

डेटा अनुबंध नाम 'SomeSubRootType: //schemas.datacontract.org/2004/07/WhatEverService' के साथ 'name.SomeSubRootType' टाइप करने की उम्मीद नहीं है। एक DataContractResolver का उपयोग करने पर विचार करें यदि आप DataContractSerializer का उपयोग कर रहे हैं या ज्ञात प्रकारों की सूची में सांख्यिकीय रूप से ज्ञात किसी भी प्रकार को नहीं जोड़ते हैं - उदाहरण के लिए, KnownTypeAttribute विशेषता का उपयोग करके या उन्हें ज्ञात प्रकार की सूची में जोड़कर serializer में उत्तीर्ण किया गया।

जिस तरह से जोड़कर मैंने हल किया KnownType

[KnownType(typeof(SomeSubRootType))]
public partial class SomeRootStructureType

यह इस उत्तर से प्रेरित होकर हल किया गया था ।

संदर्भ: https://msdn.microsoft.com/en-us/library/ms730167(v=vs.100).aspx


0

विजुअल स्टूडियो 2017 या 2019, पूरी तरह से इस पर unthoughtful है, क्योंकि दृश्य स्टूडियो में ही उत्पादन में होने की आवश्यकता है json प्रारूप है, जबकि दृश्य स्टूडियो के डिफ़ॉल्ट प्रारूप "है XmlFormat" (config.Formatters.XmlFormatter)

विजुअल स्टूडियो को डेवलपर्स को इतनी परेशानी देने के बजाय इसे स्वचालित रूप से करना चाहिए।

इस समस्या को ठीक करने के लिए, WebApiConfig.cs फ़ाइल पर जाएँ, और जोड़ें

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

रजिस्टर (HttpConfiguration config) विधि में " config.MapHttpAttributeRoutes () " के बाद । यह आपके प्रोजेक्ट को json आउटपुट का उत्पादन करने की अनुमति देगा।


0

मेरे मामले में मैंने डेटाबेस को पुनः बनाने का हल किया। मैंने एक मॉडल में कुछ बदलाव किए और पैकेज मैनेजर कंसोल में अपडेट-डेटाबेस लॉन्च करके मुझे निम्नलिखित त्रुटि मिली:

"ALTER TABLE का कथन FOREIGN KEY बाधा" FK_dbo.Activities_dbo.Projects_ProjectId "से जुड़ा है। संघर्ष डेटाबेस में हुआ" TrackEmAllContext-20190530144302 ", तालिका" dbo.Projects ", कॉलम 'Id'।"


0

मामले में: यदि WebApiConfig.cs या Global.asax.cs में कोड जोड़ना आपके लिए काम नहीं करता है:

.ToList();

.ToList () फ़ंक्शन जोड़ें।

मैंने हर समाधान की कोशिश की, लेकिन निम्नलिखित ने मेरे लिए काम किया:

var allShops = context.shops.Where(s => s.city_id == id)**.ToList()**;
return allShops;

मुझे उम्मीद है यह मदद करेगा।


0

मेरे मामले में, यह तय किया गया था कि जब मैंने अपने नेविगेशन गुणों से पहले वर्चुअल कीवर्ड को हटा दिया था, तो मेरा मतलब है संदर्भ तालिका। तो मैं बदल गया

public virtual MembershipType MembershipType { get; set; }

सेवा:

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