জসনের সাথে ওয়েব এপিআইতে প্রতিক্রিয়াটিকে সিরিয়ালাইজ করতে ব্যর্থ হয়েছে


109

আমি এএসপি.এনইটি এমভিসি 5 ওয়েব অপির সাথে কাজ করছি। আমি আমার সমস্ত ব্যবহারকারীর সাথে পরামর্শ চাই।

আমি লিখেছি api/usersএবং আমি এটি গ্রহণ করেছি:

"'অবজেক্ট কনটেন্ট`১' প্রকার সামগ্রী / প্রকারের অ্যাপ্লিকেশন / জেসসন; চরসেট = 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();
    }
}

আপনি ভোক্তার কাছে যাওয়ার চেষ্টা করছেন এমন মানটির অবজেক্টটি কেমন দেখাচ্ছে?
মেকেজেম

অনেক ধন্যবাদ! জাস্ট fyi - আমি মনে করি এটি পড়তে হবে: ব্যবহার করে (ডাটাবেস db = নতুন ডেটাবেস ()) <তালিকা <ইউজারমোডেল> listOfUser = নতুন তালিকা <ব্যবহারকারীর নাম (); foreach (var ব্যবহারকারী মধ্যে db.User) {ব্যবহারকারীমোডেল ব্যবহারকারীমোডেল = নতুন ব্যবহারকারীমোডেল (); ব্যবহারকারীমোডেল.ফার্সনেম = ব্যবহারকারীর প্রথম নাম; userModel.LastName = user.LastName; listOfUsers.Add (userModel); } অনুমিত <ইউজারমোডেল> ব্যবহারকারীগণ = listOfUser; ব্যবহারকারীদের প্রত্যাবর্তন; } .. ফলাফলগুলি সমস্ত একই মান ফিরে আসছিল।
জারেড হুইটিংটন

উত্তর:


76

যখন ওয়েব অপি (বা সেই বিষয়ে কোনও অন্য ওয়েব পরিষেবা) থেকে গ্রাহকের কাছে ডেটা ফেরত আসার কথা আসে, তখন আমি অত্যন্ত পরামর্শ দিই যে কোনও ডাটাবেস থেকে আগত সত্তাগুলি ফিরে না দেওয়া। মডেলগুলি ব্যবহার করা এটি অনেক বেশি নির্ভরযোগ্য এবং রক্ষণাবেক্ষণযোগ্য যার মধ্যে আপনার কাছে ডেটা দেখতে কেমন এবং কোনও ডাটাবেস নয় তার নিয়ন্ত্রণ রয়েছে। এইভাবে আপনাকে ওয়েবএপিপিসনফাইগে ফরম্যাটারের সাথে এতটা গোলমাল করতে হবে না। আপনি কেবলমাত্র এমন একটি ব্যবহারকারীমোডেল তৈরি করতে পারেন যার বৈশিষ্ট্য হিসাবে শিশু মডেল রয়েছে এবং প্রত্যাবর্তনের বস্তুগুলিতে রেফারেন্স লুপগুলি থেকে মুক্তি পেতে পারেন। এটি সিরিয়ালিকে অনেক বেশি সুখী করে তোলে।

এছাড়াও, আপনি যদি অনুরোধে কেবল "গ্রহণগুলি" শিরোনাম নির্দিষ্ট করে থাকেন তবে সাধারণত ফর্ম্যাটরগুলি বা সমর্থিত মিডিয়া প্রকারগুলি অপসারণ করা প্রয়োজন হয় না। এই স্টাফ নিয়ে ঘুরে বেড়ানো কখনও কখনও জিনিসগুলিকে আরও বিভ্রান্ত করতে পারে।

উদাহরণ:

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

আপনি যখন মডেলগুলি উল্লেখ করেন, আপনি কি বলতে চান আমি কী করছি? মডেল যারা ব্যবহারকারীর সংখ্যাবৃদ্ধি করুন।
ক্যাম্পদেব

5
আপনি কোনও সত্তা ফিরিয়ে দিচ্ছেন। একটি সত্তা ডিবিতে এমন একটি বিষয়কে বোঝায় যা কোনও অনন্য আইডি দ্বারা পুনরুদ্ধার করা যায়। আপনি আপনার ডাটাবেস থেকে সমস্ত ব্যবহারকারীর সত্তা ফিরিয়ে দিচ্ছেন। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি "ইউজারমোডেল" নামে একটি নতুন শ্রেণি তৈরি করেন এবং ডাটাবেস থেকে প্রাপ্ত প্রতিটি ব্যবহারকারী সত্তার জন্য আপনি প্রয়োজনীয় তথ্য দিয়ে প্রকাশিত ডেটা মডেল শ্রেণির একটি নতুন উদাহরণ তৈরি করুন। ব্যবহারকারীর সত্তার বিপরীতে ইউজারমোডেল অবজেক্টগুলির একটি মূল সংখ্যাটি প্রত্যাবর্তন করে। নিশ্চিত করুন যে মডেল বৈশিষ্ট্যগুলি ব্যবহারকারীমোডেল শ্রেণির উদাহরণগুলিকে উল্লেখ করে না। এটাই আপনাকে এই সমস্যায় ফেলছে।
jensendp

3
এনক্যাম্পুযানো সঠিক, আপনি স্বয়ংক্রিয়ভাবে উত্পন্ন উত্সগুলি ফিরিয়ে দিতে চান না। আপনি যদি ডাটাবেস অ্যাক্সেসের জন্য সঞ্চিত পদ্ধতি ব্যবহার করেন তবে বিচ্ছেদ আরও স্পষ্ট হবে। আপনার আইডিটাআডার থেকে মান অবজেক্টে ম্যাপ করা মানগুলি একটি সি # মান অবজেক্ট এবং ম্যাপ করা দরকার। যেহেতু আপনি ইএফ ব্যবহার করছেন, আপনার জন্য ক্লাস তৈরি করা হচ্ছে তবে সেগুলি বিশেষ ইএফ ক্লাস যা আরও বেশি জানে তখন মান বস্তুগুলি হয়। আপনার ক্লায়েন্টকে কেবল "বোবা" মান অবজেক্টগুলি ফিরিয়ে দেওয়া উচিত।
মেকেজেম

1
@ ডনি আপনি যদি আপনার কন্ট্রোলারে ডিবিসিএনটেক্সট বা একটি রেপোজিটরি ব্যবহার করছেন যা ডিবি থেকে সত্ত্বা ফিরিয়ে দিচ্ছে তবে আপনি নিয়ন্ত্রণকারীটিতে কেবলমাত্র মডেলগুলিতে (ডিটিওর উদাহরণস্বরূপ) অবজেক্টগুলি ম্যাপ করতে পারেন ... তবে আমি পছন্দ করতে পছন্দ করি কন্ট্রোলার এমন একটি পরিষেবা কল করে যা মডেল / ডিটিও প্রদান করে। অটোম্যাপার দেখুন - ম্যাপিং পরিচালনা করার দুর্দান্ত সরঞ্জাম।
বেন

1
@NH। আপনি পুরোপুরি উপরোক্ত শেননিগানগুলি ব্যবহার করতে পারেন তবে সমস্ত কিছুরই এটির জায়গা রয়েছে। ডেটা স্তরটিতে অ্যাক্সেস দ্বারা সরবরাহিত "সত্তা" সাধারণত ডেটা স্তরতে থাকা উচিত। অ্যাপ্লিকেশনটির ব্যবসায়ের স্তরটির মধ্যে এই ডেটাটি ব্যবহার করতে চাইলে যে কোনও কিছুই সাধারণত রূপান্তরিত ফর্মের (ডোমেন অবজেক্টস) "সত্তা" ব্যবহার করবে। এবং তারপরে যে ডেটাতে ফিরিয়ে আনা হয় এবং ব্যবহারকারীর কাছ থেকে ইনপুট হয় তা অন্য একটি ফর্ম (মডেল)) সম্মত হয়েছি যেহেতু এই ধরণের রূপান্তরটি সর্বদা করা ক্লান্তিকর হতে পারে তবে সেখানে অটোম্যাপারের মতো সরঞ্জামগুলি সত্যিই কাজে আসে।
jensendp

147

আপনি যদি গ্লোবাল.এক্সএক্সে নীচের কোডটি যুক্ত করার পাশাপাশি ইএফের সাথে কাজ করছেন

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

আমদানি করতে ভুলবেন না

using System.Data.Entity;

তারপরে আপনি নিজের ইএফ মডেলগুলি ফিরে আসতে পারেন

সরল!


এমনকি যদি এটি EF- র জন্য সহায়তা করতে পারে তবে সমাধানটি EF এর সাথে সুনির্দিষ্ট নয় এবং অন্যান্য ধরণের মডেলগুলির সাথেও কাজ করে। গ্লোবাল.এক্সএক্স-এ ব্যবহার করা প্রয়োজনীয় বলে মনে হচ্ছে না। এটি নিয়ন্ত্রকদের জন্য উদ্দেশ্য ছিল?
ম্যাথিউউ

16
এই কোডটি কী করে সে সম্পর্কে কিছু ব্যাখ্যা এবং এর প্রভাবগুলি স্বাগত জানানো হবে।
জ্যাকব

1
ধন্যবাদ আমিও একই সমস্যার মুখোমুখি হয়েছি, এই উত্তরটি আমাকে সমস্যাটি সমাধান করতে সহায়তা করেছে।
আরকে_আউস

এটা আমার জন্য কাজ করে. System.Data.Entity ব্যবহার করে যুক্ত করার দরকার নেই; গ্লোবাল.এক্স্যাক্সে। ধন্যবাদ.
ডাঃ এমএএফ

এটা কাজ করে। গ্লোবাল.এক্সএক্সে উপরের সরল অ্যাড কোড, সকলকে ধন্যবাদ, System.Data.Entity ব্যবহার করে আমদানি করার দরকার নেই;
হেমন্ত রামফুল

52

সঠিক উত্তর দেওয়া একটি উপায় যা আপনি যখন একটি কনফিগারেশন সেটিংস দ্বারা এটি ঠিক করতে পারেন তবে এটি একটি ওভারকিল।

এটি dbcontext কনস্ট্রাক্টর ব্যবহার করা ভাল

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

Asp.Net Web API ত্রুটি: 'ObjectContent`1' প্রকারের সামগ্রী / অ্যাপ্লিকেশন / এক্সএমএল জন্য প্রতিক্রিয়া বডি সিরিয়ালাইজ করতে ব্যর্থ হয়েছে; অক্ষরসেট = UTF-8 '


আমরা যদি ডাটাবেস থেকে মডেলটি আপডেট করি তবে আপনার কোড সরানো হবে।
বিমল দাস

1
আপনি এটি .tt ফাইলগুলি সরিয়ে সহজেই পৃথক করতে পারেন এবং প্রসঙ্গটি পৃথক করে রাখতে পারেন। প্রতিবার আপনি যখন মডেল উত্পন্ন করবেন তখন জায়গায় নতুন ক্লাস যুক্ত করুন। @ ব্রিমাল: আপনি এটি অনুসরণ করতে পারেন youtube.com/watch?v=yex0Z6qwe7A
মোঃ আলিম উল করিম

1
ওভাররাইট করা এড়াতে, আপনি এডএমএক্স বৈশিষ্ট্যগুলি থেকে অলস লোডটি অক্ষম করতে পারেন। এটা আমার জন্য কাজ করে।
ফ্রান্সিসকো জি

@ ফ্রেঞ্চিসকোজি এটি কাজ করে তবে এটি এডিএমএক্স সরিয়ে পুনরায় জন্মানলে তা হারিয়ে যায়।
মোঃ আলিম উল করিম

1
@BimalDas এই চেষ্টা youtube.com/... । এটি অপসারণ করবে না
মোঃ আলিম উল করিম

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 ফর্ম্যাটরটি সরিয়ে ফেলতে হবে?
জাভা_1

জসন সিরিয়ালাইজার যুক্ত করার দরকার নেই (কমপক্ষে আমার ক্ষেত্রে) তবে এক্সএমএল বিন্যাস অপসারণের প্রয়োজন ছিল। আমি অনুমান করি যে এক্সএমএল সিরিয়ালাইজার বেনামে ধরণের সিরিয়ালাইজ করতে পারে না এবং এটি সরিয়ে ফলাফলটি জসন হিসাবে সিরিয়ালযুক্ত হয়। যদি আমার অনুমান সঠিক হয় তবে এমআইএমআই টাইপ "অ্যাপ্লিকেশন / জেসসন" টাইপ জিজ্ঞাসা করে একজন নিয়ন্ত্রণকারীর কাছ থেকে ডেটা বের করতে সক্ষম হবে।
লসম্যানোস

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();
    }
}

বাহ, এটা আমার জন্য কাজ করে। কিন্তু কেন? প্রক্সিক্রেশনেশন সক্ষম সম্পত্তিটি কী করে?
জ্যাকট্রিক

আমার সাথে কাজ কিন্তু এই কোড কি? আমি আরও উল্লেখ করেছি যে সমস্ত সাব ক্লাস নালার সাথে পুনরুদ্ধার করা হয়েছে !!
ওয়ালিদ এ। এলগিলিল

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(typeof(TestClass))]
public class TestClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

এটি আমার পক্ষে কাজ করে!


আপনি যদি ডায়নামিক কলামগুলির সাথে লিনক পিভট ব্যবহার করছেন?
কোডগ্রিড

[জ্ঞাত টাইপঅ্যাট্রিবিউট (টাইফফ (টেস্টক্লাস))] আমার সমস্যার সমাধান করেছে
গিলিয়াম রেমন্ড

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); 
// ...
}

পদ্ধতি 2: [প্রস্তাবিত নয়]
আপনি যদি সত্ত্বা ফ্রেমওয়ার্কের সাথে কাজ করছেন তবে আপনি আপনার ডিবিকন্টেক্সট ক্লাস কনস্ট্রাক্টরে প্রক্সি অক্ষম করতে পারবেন। দ্রষ্টব্য: আপনি যদি মডেলটি আপডেট করেন তবে এই কোডটি সরানো হবে

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

1
ধন্যবাদ সুমন আমি একই সমস্যা ছিল। আমি আমার ওয়েব এপিআই পরীক্ষা করছিলাম এবং এই সমস্যাটিতে আটকেছি। আপনার সমাধান সমস্যার সমাধান করে। অনেক ধন্যবাদ.
তারকপ্রজপতি

4

আমার ব্যক্তিগত প্রিয়: কেবল নীচে কোড যুক্ত করুন App_Start/WebApiConfig.cs। এটি ডিফল্টরূপে XML এর পরিবর্তে জসনকে ফিরিয়ে দেবে এবং আপনার যে ত্রুটি ছিল তা রোধ করবে। Global.asaxমুছে ফেলার জন্য সম্পাদনা করার দরকার নেই XmlFormatteretc.

'অবজেক্ট কনটেন্ট`১' প্রকার সামগ্রী / প্রকারের অ্যাপ্লিকেশন / এক্সএমএল জন্য প্রতিক্রিয়া বডি সিরিয়ালাইজ করতে ব্যর্থ হয়েছে; অক্ষরসেট = UTF-8

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

2

অটোম্যাপার ব্যবহার করুন ...

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]ধারাবাহিকভাবে প্রতিটি সম্পত্তি জন্য বৈশিষ্ট্যাবলী। এটি জেসন ফলাফল পাওয়ার জন্য যথেষ্ট (উদাহরণস্বরূপ। ফিজার থেকে)।

  2. এই কোডটিতে এক্সএমএল সিরিয়ালাইজেশন লিখুন Global.asax:

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

  3. এই নিবন্ধটি পড়ুন, এটি আমাকে সিরিয়ালায়ন বুঝতে সাহায্য করেছে: https://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xML-seialization

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
আপনার জন্য অনুবাদটি হ্যান্ডেল করার জন্য আরও মার্জিত উপায় রয়েছে যাতে আপনার প্রতিটি সম্পত্তি বজায় রাখতে না হয় .. অটোম্যাপার এবং ভ্যালুইঞ্জেক্টর হ'ল দুটি উল্লেখযোগ্য
সোল

1

এটি আমার ত্রুটি

আমি মূলত একটি লাইন যা তারা হয় যোগ করুন

  • entities.Configration.ProxyCreationEn اهل = মিথ্যা;

ইউজারকন্ট্রোলার। সি

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

অ্যাপ্লিকেশন স্টার্ট ফোল্ডারে যেমন ওয়েবএপিসিফিগ.সি.সি. এর মধ্যে আপনাকে সিরিয়ালাইজার ফর্ম্যাটর সংজ্ঞায়িত করতে হবে

কনফিগারেশন যোগ করছে Forফর্মেটর.সামুভ (কনফিগার.ফর্মেটর.এক্সএমএল ফর্ম্যাটটার); // যা আপনাকে JSON ফর্ম্যাটে ডেটা সরবরাহ করবে

কনফিগারেশন.ফর্ম্যাটরগুলি যোগ করা হচ্ছে em সরান (কনফিগারেশন.ফর্মেটর.জসন ফোরমেটার); // যা আপনাকে এক্সএমএল ফর্ম্যাটে ডেটা সরবরাহ করবে


আপনি একটি পদক প্রাপ্য।
দ্যক্রোগ্রামার

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

অন্য একটি ক্ষেত্রে যেখানে আমি এই ত্রুটিটি পেয়েছি তা হল যখন আমার ডাটাবেস ক্যোয়ারীটি একটি নাল মান ফিরিয়েছিল তবে আমার ব্যবহারকারী / দর্শন মডেল প্রকারটি অ-অযোগ্য হিসাবে সেট করা হয়েছিল। উদাহরণস্বরূপ, আমার ব্যবহারকারীমোডেল ক্ষেত্রটি থেকে intসমাধানে পরিবর্তন int?করা।


0

রেসপন্স-টাইপটি সর্বজনীন না হলে এটিও ঘটে! আমি টাইপটি আমাকে তৈরি করতে ভিজ্যুয়াল স্টুডিও ব্যবহার করার সাথে সাথে আমি একটি অভ্যন্তরীণ ক্লাস ফিরে পেয়েছি।

internal class --> public class

0

উপরের এই সমস্ত উত্তর সঠিক থাকলেও কেউ ইনার এক্সেপশন> এক্সেপশনমেসেজ পরীক্ষা করতে চাইতে পারেন ।

যদি এটি "T He ObjectContext উদাহরণের মতো কিছু বলে থাকে তবে এটি সংযোগের প্রয়োজন হয় এমন ক্রিয়াকলাপগুলির জন্য আর ব্যবহার করা যাবে না। " EF এর ডিফল্ট আচরণের কারণে এটি একটি সমস্যা হতে পারে।

আপনার DbContext কনস্ট্রাক্টরে LazyLoadingEnabled = মিথ্যা নির্ধারণের মাধ্যমে কৌতুকটি করা হবে।

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

মতিন এর EagerLoading এবং LazyLoading আচরণ সম্পর্কে আরো বিস্তারিত পড়ার জন্য এই পড়ুন দুটিই MSDN ধারা


0

আমার ক্ষেত্রে আমার অনুরূপ ত্রুটি বার্তা ছিল:

'অবজেক্ট কনটেন্ট`১' প্রকার সামগ্রী / প্রকারের অ্যাপ্লিকেশন / এক্সএমএল জন্য প্রতিক্রিয়া বডি সিরিয়ালাইজ করতে ব্যর্থ হয়েছে; অক্ষরসেট = UTF-8 '।

তবে যখন আমি এটির গভীরতর গভীরতা পাই, তখন সমস্যাটি ছিল:

ডেটা চুক্তির নাম সহ 'নাম.সোমসুব্রুটটাইপ' টাইপ করুন 'সামসুব্রুটটাইপ: //schemas.datacontract.org/2004/07/WhatEverService' প্রত্যাশিত নয়। আপনি যদি ডাটাকন্ট্রাক্টরিশালাইজার ব্যবহার করে থাকেন বা পরিচিত ধরণের তালিকায় স্থিতিশীলভাবে জানা যায় না এমন কোনও ধরণের সংযোজন করেন - উদাহরণস্বরূপ, জ্ঞাত টাইপঅ্যাট্রিবিউট বৈশিষ্ট্যটি ব্যবহার করে বা সেগুলি সিরিয়ালে পাস করা প্রকারের তালিকায় যুক্ত করে Data

যুক্ত করে যেভাবে সমাধান করেছি 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)

বিকাশকারীদের এত কষ্ট দেওয়ার পরিবর্তে ভিজ্যুয়াল স্টুডিওর এটি স্বয়ংক্রিয়ভাবে করা উচিত।

এই সমস্যাটি সংশোধন করতে, ওয়েবএপিপিফিগ.সি.এসযান ফাইলে এবং যুক্ত করুন

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

" কনফিগারেশন। ম্যাপএইচটিএইচটিপিএ্যাট্রিবিউটরুটস (); " এর পরে রেজিস্টার (এইচটিটিপি কনফিগারেশন কনফিগারেশন) পদ্ধতিতে। এটি আপনার প্রকল্পকে জসন আউটপুট উত্পাদন করার অনুমতি দেবে।


0

আমার ক্ষেত্রে আমি ডাটাবেস পুনরায় তৈরি করার সমাধান করেছি। আমি একটি মডেলটিতে কিছু পরিবর্তন করেছি এবং প্যাকেজ ম্যানেজার কনসোলে আপডেট-ডেটাবেস চালু করেছিলাম আমি নিম্নলিখিত ত্রুটি পেয়েছি:

"ALTER TABLE বিবৃতিটি বিদেশী KEY বাধা" FK_dbo.Activityities_dbo.Pro پروژې_প্রজেক্টআইডি "এর সাথে সাংঘর্ষিক।


0

ক্ষেত্রে: ওয়েবএপিপিফিনি.সি.এস বা গ্লোবাল.এক্সএক্স.এক্স. কোডগুলিতে কোড যুক্ত করা যদি আপনার পক্ষে কাজ করে না:

.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; }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.