Web.config dosyasında maxJsonLength için sınırsız bir uzunluk ayarlayabilir miyim?


663

JQuery otomatik tamamlama özelliğini kullanıyorum. 17000'den fazla kayıt listesini almaya çalıştığımda (her biri 10 karakterden fazla olmayacak), uzunluğu aşıyor ve hatayı atıyor:

Özel durum bilgileri:
Özel durum türü: InvalidOperationException
Özel durum iletisi: JSON JavaScriptSerializer kullanılarak serileştirme veya serileştirme sırasında hata. Dizenin uzunluğu, maxJsonLength özelliğinde ayarlanan değeri aşıyor.

Ben bir sınırsız uzunluğu ayarlayabilir miyim maxJsonLengthde web.config? Değilse, ayarlayabileceğim maksimum uzunluk nedir?


1
Anlaşılan bir şey oldukça açık olabilir, bu yüzden lütfen eğer düşündüyseniz, beni affedin; Json dizesi ayrıca her kaydın etrafındaki süslü parantezleri, her alan adı [ve değeri] etrafındaki tırnak işaretlerinin yanı sıra alan adı ve değerini de içerir. Bu nedenle, alan adını tek bir karakter olarak ayarlamak yararlı olabilir ve değer bir dize değilse, alan türünü tırnak işaretleri içermeyecek şekilde doğru ayarladığınızdan emin olun.
MichaelJTaylor

Yanıtlar:


719

NOT: Bu yanıt yalnızca Web hizmetleri için geçerlidir, JSON'u bir Controller yönteminden döndürüyorsanız, aşağıdaki SO yanıtını da okuduğunuzdan emin olun: https://stackoverflow.com/a/7207539/1246870


MaxJsonLength özelliği sınırsız olamaz, bir tam sayı özelliği olduğunu varsayılan için 102400 (100k).

MaxJsonLengthÖzelliği web.config dosyasında ayarlayabilirsiniz :

<configuration> 
   <system.web.extensions>
       <scripting>
           <webServices>
               <jsonSerialization maxJsonLength="50000000"/>
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration> 

153
Bu bir tamsayıdır, böylece ayarlayabileceğiniz maksimum değer: 2147483644
David Espart

57
@despart: Yani 2
147483

6
@ kmcc049, söz bakarsanız, OP, çünkü IMO değerler yanlış değildir sormuyorum "maxJsonLength varsayılan değeri ne?" (BTW, en çok oylanan ikinci cevap bu, yanlış soruyu cevaplıyor), bu özelliği "sınırsız" olarak ayarlamaya çalışıyor, ancak bir Tamsayı olduğu için, mümkün olan maksimum değer 2147483647@depsart ve @ Descár'ın işaret ettiği gibi.
CMS

11
Harika ama MVC return Json()veya
benzeri bir

3
@ Dercsár: amaç ne? 2147483644 1024 ile mükemmel bölünebilen en büyük tamsayıdır.
Naveen

461

MVC 4 kullanıyorsanız , bu yanıtı da kontrol ettiğinizden emin olun .


Hala hatayı alıyorsanız:

  • maxJsonLengthözelliği web.config dosyasında maksimum değerine ayarladıktan sonra
  • ve verilerinizin uzunluğunun bu değerden daha az olduğunu biliyorsunuz
  • JavaScript serileştirmesi için bir web hizmeti yöntemi kullanmıyorsunuz

senin sorunun muhtemelen:

MaxJsonLength özelliğinin değeri, yalnızca Eşzamansız iletişim katmanı tarafından Web hizmetleri yöntemlerini çağırmak için kullanılan dahili JavaScriptSerializer örneği için geçerlidir. ( MSDN: ScriptingJsonSerializationSection.MaxJsonLength Özelliği )

Temel olarak, "dahili" bir web yönteminden çağrıldığında JavaScriptSerializerdeğerine saygı duyar maxJsonLength; doğrudan bir kullanımı JavaScriptSerializer(MVC aksiyon yöntemi / Kontrol ile veya kullanım) etmez değil saygı maxJsonLengthen az olmayan gelen, özelliği systemWebExtensions.scripting.webServices.jsonSerializationweb.config bölümü.

Geçici bir çözüm olarak, Denetleyicinizde (veya gerçekten herhangi bir yerde) aşağıdakileri yapabilirsiniz:

var serializer = new JavaScriptSerializer();

// For simplicity just use Int32's max value.
// You could always read the value from the config section mentioned above.
serializer.MaxJsonLength = Int32.MaxValue;

var resultData = new { Value = "foo", Text = "var" };
var result = new ContentResult{
    Content = serializer.Serialize(resultData),
    ContentType = "application/json"
};
return result;

Bu cevap, bu asp.net forum yanıtını yorumum .


5
Json()Asp.net mvc eylem sonuç yöntemini kullandığım gibi cevabınız gerçekten yararlı oldu .
jessegavin

3
Evet ben de bir Json () hastasıydım. Teşekkürler!
BritishDeveloper

3
Tamamen doğru ve yerini hak etmesine rağmen, bu en iyi cevabı geçmeye değer olduğu sorulardan biridir :). Teşekkürler!
Nigel

3
MVC4 kullanıyorsanız, lütfen @fanisch yanıtına da bakın.
Beyers

4
Deserialization nasıl olur? Bu hatayı eylemin model bağlamasında karşıladım.
guogangj

345

MVC 4'te şunları yapabilirsiniz:

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult()
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior,
        MaxJsonLength = Int32.MaxValue
    };
}

kontrolörünüzde.

İlave:

Belirtmeniz gereken parametrelerle şaşkın olan herkes için bir çağrı şöyle görünebilir:

Json(
    new {
        field1 = true,
        field2 = "value"
        },
    "application/json",
    Encoding.UTF8,
    JsonRequestBehavior.AllowGet
);

6
Yukarıdaki MVC 4 bir cazibe gibi çalıştığını onaylayabilirsiniz, teşekkür fanisch.
Beyers

9
Ben de teyit edebilirim. Bu kodu bir baz kontrolörüne koymak kesinlikle önerilen en temiz yaklaşımdır.
parlamento

15
Bu, yalnızca eylem sonucuna "MaxJsonLength = Int32.MaxValue" eklenerek de çalışır. Değişiklik istenmiyorsa kontrolör veya proje çapında.
Hypnovirus

3
Bu en iyi cevap. MaxJsonLength her denetleyici için yapılandırılabilir.
liang

3
UYARI: bu çözüm yanıtın sıkıştırılmasını (istenirse) devre dışı bırakır. Bu filtreyi işleminize ekleyin: stackoverflow.com/questions/3802107/…
Gorgi Rankovski

60

Web.config dosyanızdaki json istekleri için maksimum uzunluğu yapılandırabilirsiniz:

<configuration>
    <system.web.extensions>
        <scripting>
            <webServices>
                <jsonSerialization maxJsonLength="....">
                </jsonSerialization>
            </webServices>
        </scripting>
    </system.web.extensions>
</configuration>

MaxJsonLength için varsayılan değer 102400'dür . Daha fazla ayrıntı için şu MSDN sayfasına bakın: http://msdn.microsoft.com/en-us/library/bb763183.aspx


1
Bu tamsayıdaki saklanan değer neyi temsil eder? Bu bir çeşit karakter mi? Sanırım ne soruyorum, neden bir tamsayı kullanılıyor? Teşekkürler!
eaglei22

@ eaglei22 sayı, maxJsonLength için kaç bayt kullanılabileceğini gösterir. M4N'in belirttiği gibi, 102400 varsayılan değerdir (100KB).
Jacob Plonke

Bu benim için işe yaramadı ve web hizmetlerini kullanmadım.
Kalai

42

aşağıdaki gibi web.config ayarından sonra hala hata alıyorsanız:

<configuration> 
   <system.web.extensions>
       <scripting>
           <webServices>
               <jsonSerialization maxJsonLength="50000000"/>
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration> 

Aşağıdaki ile çözdüm:

   public ActionResult/JsonResult getData()
   {
      var jsonResult = Json(superlargedata, JsonRequestBehavior.AllowGet);
      jsonResult.MaxJsonLength = int.MaxValue;
      return jsonResult;
    }

Umarım bu yardımcı olur.


2
Web.config dosyasındaki maxJsonLength öğesini ayarlamak kolay değildir, jsonResult.MaxJsonLength ayarının yapılması yeterli olmalıdır (en azından benim için yaptı (MVC5))
hormberg

Bu iyi çünkü küresel bir değişiklik değil.
rob_james

40

ASP.NET Web Formlarında bu sorunu yaşıyordum. Tamamen web.config dosya ayarlarını yoksayıyordu, bu yüzden bunu yaptım:

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

Tabii ki genel olarak bu korkunç bir uygulamadır. Bir web servis çağrısında bu kadar veri gönderiyorsanız, farklı bir yaklaşıma bakmalısınız.


1
bu senin için işe yaradı mı? bu kodu nereye yerleştirdin
user1012598

Bizim sorunumuz, HTML için izin verilen bir textareamız vardı ve insanlar görüntüleri HTML olarak gömüyorlardı, bu da girişin çok büyük olmasına ve JSON serileştiricisinin başarısız olmasına neden oldu. Sanırım kullanıcılar bunu yapabilir mi ...
Marko

Lütfen bu kodu nereye koymamız gerektiğini açıklayın ... @Flea
Koray Durudogan

@KorayDurudogan - Bunu, yanıtı döndüren Ajax yöntemine koydum, bu yüzden denetleyicimde. Umarım yardımcı olur!
Pire

Yanıtınıza meydan okumuyorum, ancak daha iyi yaklaşımların ne olduğu hakkında daha iyi bir fikir edinmeye çalışıyorum. Kullanıcının ölçütlerine bağlı olarak sonuç boyutunu belirleyecek bir sorgu var. Bir JsonResult döndürüyorum, bir excel dosyası döndürdüğümde sorun olur mu?
eaglei22

22

Düzelttim.

//your Json data here
string json_object="........";
JavaScriptSerializer jsJson = new JavaScriptSerializer();
jsJson.MaxJsonLength = 2147483644;
MyClass obj = jsJson.Deserialize<MyClass>(json_object);

Çok iyi çalışıyor.


Müthiş! Bu, küresel bir değişim olmadığı için benim için ve daha iyi olan tek çözümdür. Teşekkürler!
Sealer_05

20

Vestigal'ın cevabını takip ettim ve bu çözüme ulaştım:

Bir denetleyicideki bir eylem için büyük bir json yayınlamak gerektiğinde, ünlü "JSON JavaScriptSerializer kullanarak serisini kaldırma sırasında hata. Ben dize uzunluğu maxJsonLength özelliği ayarlanan değeri aşıyor. \ R \ nParametre adı: giriş değer sağlayıcı ".

Yaptığım yeni bir ValueProviderFactory, LargeJsonValueProviderFactory oluşturmak ve GetDeserializedObject yönteminde MaxJsonLength = Int32.MaxValue ayarlamak

public sealed class LargeJsonValueProviderFactory : ValueProviderFactory
{
private static void AddToBackingStore(LargeJsonValueProviderFactory.EntryLimitedDictionary backingStore, string prefix, object value)
{
    IDictionary<string, object> dictionary = value as IDictionary<string, object>;
    if (dictionary != null)
    {
        foreach (KeyValuePair<string, object> keyValuePair in (IEnumerable<KeyValuePair<string, object>>) dictionary)
            LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);
    }
    else
    {
        IList list = value as IList;
        if (list != null)
        {
            for (int index = 0; index < list.Count; ++index)
                LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakeArrayKey(prefix, index), list[index]);
        }
        else
            backingStore.Add(prefix, value);
    }
}

private static object GetDeserializedObject(ControllerContext controllerContext)
{
    if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
        return (object) null;
    string end = new StreamReader(controllerContext.HttpContext.Request.InputStream).ReadToEnd();
    if (string.IsNullOrEmpty(end))
        return (object) null;

    var serializer = new JavaScriptSerializer {MaxJsonLength = Int32.MaxValue};

    return serializer.DeserializeObject(end);
}

/// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
/// <returns>A JSON value-provider object for the specified controller context.</returns>
/// <param name="controllerContext">The controller context.</param>
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
    if (controllerContext == null)
        throw new ArgumentNullException("controllerContext");
    object deserializedObject = LargeJsonValueProviderFactory.GetDeserializedObject(controllerContext);
    if (deserializedObject == null)
        return (IValueProvider) null;
    Dictionary<string, object> dictionary = new Dictionary<string, object>((IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase);
    LargeJsonValueProviderFactory.AddToBackingStore(new LargeJsonValueProviderFactory.EntryLimitedDictionary((IDictionary<string, object>) dictionary), string.Empty, deserializedObject);
    return (IValueProvider) new DictionaryValueProvider<object>((IDictionary<string, object>) dictionary, CultureInfo.CurrentCulture);
}

private static string MakeArrayKey(string prefix, int index)
{
    return prefix + "[" + index.ToString((IFormatProvider) CultureInfo.InvariantCulture) + "]";
}

private static string MakePropertyKey(string prefix, string propertyName)
{
    if (!string.IsNullOrEmpty(prefix))
        return prefix + "." + propertyName;
    return propertyName;
}

private class EntryLimitedDictionary
{
    private static int _maximumDepth = LargeJsonValueProviderFactory.EntryLimitedDictionary.GetMaximumDepth();
    private readonly IDictionary<string, object> _innerDictionary;
    private int _itemCount;

    public EntryLimitedDictionary(IDictionary<string, object> innerDictionary)
    {
        this._innerDictionary = innerDictionary;
    }

    public void Add(string key, object value)
    {
        if (++this._itemCount > LargeJsonValueProviderFactory.EntryLimitedDictionary._maximumDepth)
            throw new InvalidOperationException("JsonValueProviderFactory_RequestTooLarge");
        this._innerDictionary.Add(key, value);
    }

    private static int GetMaximumDepth()
    {
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers");
            int result;
            if (values != null && values.Length > 0 && int.TryParse(values[0], out result))
                return result;
        }
        return 1000;
     }
  }
}

Sonra Global.asax.cs Application_Start yönteminde, ValueProviderFactory yenisiyle değiştirin:

protected void Application_Start()
{
    ...

    //Add LargeJsonValueProviderFactory
    ValueProviderFactory jsonFactory = null;
    foreach (var factory in ValueProviderFactories.Factories)
    {
        if (factory.GetType().FullName == "System.Web.Mvc.JsonValueProviderFactory")
        {
            jsonFactory = factory;
            break;
        }
    }

    if (jsonFactory != null)
    {
        ValueProviderFactories.Factories.Remove(jsonFactory);
    }

    var largeJsonValueProviderFactory = new LargeJsonValueProviderFactory();
    ValueProviderFactories.Factories.Add(largeJsonValueProviderFactory);
}

1
Yapabildiğim her şeyi yaptım, sadece cevabım günümü kurtardı, bu cevap kabul edilmeliydi
Muhammad Waqas Aziz

Bu kod ile MVC denetleyicisi max json 4 mb Deserializetion sınırını geçersiz kılabiliriz, ancak web-api denetleyicisi max json Deserializetion limitini geçersiz kılmanın bir yolu var
Muhammad Waqas Aziz

17

yukarıdaki eklemeyi web.config dosyanıza uyguladıktan sonra, “Tanınmayan yapılandırma bölümü system.web.extensions” alırsınız. hatasıyla bunu web.config dosyasına aşağıdaki <ConfigSections>bölümde eklemeyi deneyin :

            <sectionGroup name="system.web.extensions" type="System.Web.Extensions">
              <sectionGroup name="scripting" type="System.Web.Extensions">
                    <sectionGroup name="webServices" type="System.Web.Extensions">
                          <section name="jsonSerialization" type="System.Web.Extensions"/>
                    </sectionGroup>
              </sectionGroup>
        </sectionGroup>

4
Bu sorunu yaşıyordum. Ancak, bu cevap benim için işe yaramadı. Burada açıklanan <sectionGroup> öğesini eklemek yerine, yeni eklenen <system.web.extensions> bloğunun tamamını web.config ... 'in hemen sonuna kadar </configuration> taşıdım. Sonra işe yaradı.
ClearCloud8

Bu yardımcı oldu, ancak benim durumumda<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/> bu sayfada görüldüğü gibi dördüncü satırınızı değiştirmem gerekiyordu : forums.asp.net/t/1446510.aspx/1
Nathan

@ ClearCloud8 Bu yorumun hemen bu sayfaya yayılmasını sağlayın.
Jack Nutkins

11

bu satırı Denetleyiciye yazabilirsiniz

json.MaxJsonLength = 2147483644;

ayrıca bu satırı web.config

<configuration>
  <system.web.extensions>
    <scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>
  </system.web.extensions>

'

Güvenli tarafta olmak için her ikisini de kullanın.


10

MVC MiniProfiler bu hatayı alıyorsanız özelliği MiniProfiler.Settings.MaxJsonResponseSizeistenen değere ayarlayarak değeri artırabilirsiniz . Varsayılan olarak, bu araç config içinde ayarlanan değeri yok sayar.

MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

Nezaket mvc-mini-profiler .


10

Basitçe MVC'nin Eylem yönteminde MaxJsonLength özelliğini ayarla

JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet);
json.MaxJsonLength = int.MaxValue;
return json;

9

Int32.MaxValue olarak ayarlamanızı öneririz.

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;

9

Bazı özellik sihirlerine ne dersiniz?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class MaxJsonSizeAttribute : ActionFilterAttribute
{
    // Default: 10 MB worth of one byte chars
    private int maxLength = 10 * 1024 * 1024;

    public int MaxLength
    {
        set
        {
            if (value < 0) throw new ArgumentOutOfRangeException("value", "Value must be at least 0.");

            maxLength = value;
        }
        get { return maxLength; }
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        JsonResult json = filterContext.Result as JsonResult;
        if (json != null)
        {
            if (maxLength == 0)
            {
                json.MaxJsonLength = int.MaxValue;
            }
            else
            {
                json.MaxJsonLength = maxLength;
            }
        }
    }
}

Daha sonra, küresel filtre yapılandırmasını veya denetleyici / eylem açısından kullanarak küresel olarak uygulayabilirsiniz.


Mükemmel cevap. Özel özelliklerin güzel kullanımı. Max (int.MaxValue) yerine varsayılan değeri 10 MB değerinde bir bayt karakter olarak ayarlamanızın belirli (teknik) bir nedeni olup olmadığını mı merak ediyorsunuz?
Josh

@Josh Hayır, bunun için özel bir neden yoktu.
Balázs

5

Asıl soru, gerçekten 17 bin kayıt döndürmeniz gerekip gerekmediğidir. Tarayıcıdaki tüm verileri nasıl ele almayı planlıyorsunuz? Kullanıcılar zaten 17000 satır arasında gezinmeyecekler.

Daha iyi bir yaklaşım, yalnızca bir "ilk birkaç" kayıt almak ve gerektiğinde daha fazla yükleme yapmaktır.


1
Json'un varsayılan listesi 17k kayıt verecektir. Ancak otomatik tamamlama özelliği yalnızca kullanıcının yazdığı karakterlerle eşleşen kayıtları listeler, bu nedenle listeyi daha fazla kaydırması gerekmez. SO ne gerek 17k veri serileştirebilir maxJsonLength için sınırsız uzunluk ayarlamaktır.
Prasad

6
Sunucu ve istemci tarafı filtrelemenin bir kombinasyonunu kullanabilirsiniz. Ağ gecikmesinden bahsetmiyorum bile, istemci tarafındaki tüm verileri filtrelemek zor olabilir.
Chetan Sastry

1
Bir süre önce bu aynı konuya geldikten sonra, otomatik tamamlama için bir "araştırma" işleyicisi uygulamayı seçtim ve web hizmeti çağrısının "arama" metnini geçmesini ve filtre olarak arama ölçütlerini kullanarak bir Top10 sorgusu yapmasını seçtim. Bu, daha fazla tek tek ajax isteği anlamına geliyordu, bu sadece sayfa yüklemesinde tam listeyi almaktı, ancak aynı zamanda tüm isteklerin / yanıtların çok daha küçük olduğu anlamına geliyordu .
Mike U

3

Yapılandırmada diğerlerinin söylediği gibi ayarlayabilir veya serileştiricinin tek bir örneğini aşağıdaki gibi ayarlayabilirsiniz:

var js = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue };

3

MVC3 ile JSON ile sorun yaşayanlar için, bu bir model bağlayıcı için otomatik olarak serileştiriliyor ve çok büyük, işte bir çözüm.

  1. MVC3 kaynak kodundan JsonValueProviderFactory sınıfının kodunu yeni bir sınıfa kopyalayın.
  2. Nesnenin serileştirilmesinden önceki maksimum JSON uzunluğunu değiştirmek için bir çizgi ekleyin.
  3. JsonValueProviderFactory sınıfını yeni, değiştirilmiş sınıfınızla değiştirin.

Bunun nasıl yapılacağı konusunda beni doğru yöne yönlendirdikleri için http://blog.naver.com/techshare/100145191355 ve https://gist.github.com/DalSoft/1588818 teşekkürler . İlk sitedeki son bağlantı, çözümün tam kaynak kodunu içerir.


3

Görünüm'de bu tür bir sorunla karşılaşıyorsanız, sorunu çözmek için aşağıdaki yöntemi kullanabilirsiniz. Dolu Bos Buraya Newtonsoft paketi.

@using Newtonsoft.Json
<script type="text/javascript">
    var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part));
</script>

Bu, Json.NET kullanırsam maksimum uzunluk konusunda endişelenmem gerekmediği anlamına mı geliyor? Json.NET'te maksimum uzunluğu ayarlamanın bir yolu olduğunu düşünmüyorum, bu yüzden kutunun dışında çalıştığını umuyorum.
kimbaudi

1
Mükemmel Cevap teşekkür ederim! Bu, bir nesneyi yüklemeye çalışırken de işe yaradı.
user1299379

3
 JsonResult result = Json(r);
 result.MaxJsonLength = Int32.MaxValue;
 result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 return result;

2

Görünüşe göre "sınırsız" değer yok. Varsayılan değer, 4 MB Unicode dize verisine eşdeğer olan 2097152 karakterdir.

Daha önce gözlemlendiği gibi, 17.000 kaydın tarayıcıda iyi kullanılması zordur. Toplu bir görünüm sunuyorsanız, toplamayı sunucuda yapmak ve tarayıcıda yalnızca bir özet aktarmak çok daha verimli olabilir. Örneğin, bir dosya sistemi tarayıcısını düşünün, yalnızca ağacın üstünü görüyoruz, daha sonra ayrıntıya inerken başka istekler de yayınlıyoruz. Her istekte döndürülen kayıt sayısı nispeten azdır. Bir ağaç görünümü sunusu büyük sonuç kümeleri için iyi sonuç verebilir.


3
oldukça tuhaf kodu varsayılan (yeni JavaScriptSerializer ()). MaxJsonLength 2097152 bayt ama açıkça ayarlanmadığı sürece ResponseFormatJson web hizmeti 102400 bayt.
soymak

2

Sadece bununla karşılaştı. 6.000'den fazla kayıt alıyorum. Sadece biraz sayfalama yapmaya karar verdim. Olduğu gibi, MVC JsonResult uç noktamda varsayılan olarak 0 olan bir sayfa numarasını kabul ediyorum, bu yüzden gerekli değildir, bu yüzden:

public JsonResult MyObjects(int pageNumber = 0)

Sonra şunu söylemek yerine:

return Json(_repository.MyObjects.ToList(), JsonRequestBehavior.AllowGet);

Diyorum:

return Json(_repository.MyObjects.OrderBy(obj => obj.ID).Skip(1000 * pageNumber).Take(1000).ToList(), JsonRequestBehavior.AllowGet);

Çok basit. Ardından, bunun yerine JavaScript'te:

function myAJAXCallback(items) {
    // Do stuff here
}

Bunun yerine şunu söylüyorum:

var pageNumber = 0;
function myAJAXCallback(items) {
    if(items.length == 1000)
        // Call same endpoint but add this to the end: '?pageNumber=' + ++pageNumber
    }
    // Do stuff here
}

Ve kayıtlarınızı ilk etapta onlarla yaptığınız her şeye ekleyin. Veya tüm aramalar bitene kadar bekleyin ve sonuçları birlikte toplayın.


2

Bu kodu ekleyerek sorunu çözdüm:

String confString = HttpContext.Current.Request.ApplicationPath.ToString();
Configuration conf = WebConfigurationManager.OpenWebConfiguration(confString);
ScriptingJsonSerializationSection section = (ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization");
section.MaxJsonLength = 6553600;
conf.Save();

Bu hackish bir çözüm gibi görünüyor ama ne olursa olsun ilginç bir yaklaşım. Yararlı buldum teşekkürler! Benim için apsnet mvc 5 denetleyicisinde ad alanından 'Current' kaldırmak zorunda kaldı. Birkaç ayar yaptım:string confString = HttpContext.Request.ApplicationPath.ToString(); var conf = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(confString); var section = (System.Web.Configuration.ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization"); section.MaxJsonLength = int.MaxValue; conf.Save();
ooXei1sh

2

ASP.NET MVC 5 Düzeltme:

(Benimki yukarıdaki birkaç küçük değişiklikle MFC yanıtına benziyor)

Henüz Json.NET'e geçmeye hazır değildim ve benim durumumda istek sırasında hata oluşuyordu. Senaryomdaki en iyi yaklaşım JsonValueProviderFactory, düzeltmeyi genel projeye uygulayan ve global.csdosyayı bu şekilde düzenleyerek yapılabilen gerçekleri değiştirmektir .

JsonValueProviderConfig.Config(ValueProviderFactories.Factories);

web.config girişi ekleyin:

<add key="aspnet:MaxJsonLength" value="20971520" />

ve ardından aşağıdaki iki sınıfı oluşturun

public class JsonValueProviderConfig
{
    public static void Config(ValueProviderFactoryCollection factories)
    {
        var jsonProviderFactory = factories.OfType<JsonValueProviderFactory>().Single();
        factories.Remove(jsonProviderFactory);
        factories.Add(new CustomJsonValueProviderFactory());
    }
}

Bu, temel olarak bulunan varsayılan uygulamanın tam bir kopyasıdır, System.Web.Mvcancak yapılandırılabilir bir web.config appsetting değeri eklenir aspnet:MaxJsonLength.

public class CustomJsonValueProviderFactory : ValueProviderFactory
{

    /// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
    /// <returns>A JSON value-provider object for the specified controller context.</returns>
    /// <param name="controllerContext">The controller context.</param>
    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        if (controllerContext == null)
            throw new ArgumentNullException("controllerContext");

        object deserializedObject = CustomJsonValueProviderFactory.GetDeserializedObject(controllerContext);
        if (deserializedObject == null)
            return null;

        Dictionary<string, object> strs = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
        CustomJsonValueProviderFactory.AddToBackingStore(new CustomJsonValueProviderFactory.EntryLimitedDictionary(strs), string.Empty, deserializedObject);

        return new DictionaryValueProvider<object>(strs, CultureInfo.CurrentCulture);
    }

    private static object GetDeserializedObject(ControllerContext controllerContext)
    {
        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            return null;

        string fullStreamString = (new StreamReader(controllerContext.HttpContext.Request.InputStream)).ReadToEnd();
        if (string.IsNullOrEmpty(fullStreamString))
            return null;

        var serializer = new JavaScriptSerializer()
        {
            MaxJsonLength = CustomJsonValueProviderFactory.GetMaxJsonLength()
        };
        return serializer.DeserializeObject(fullStreamString);
    }

    private static void AddToBackingStore(EntryLimitedDictionary backingStore, string prefix, object value)
    {
        IDictionary<string, object> strs = value as IDictionary<string, object>;
        if (strs != null)
        {
            foreach (KeyValuePair<string, object> keyValuePair in strs)
                CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);

            return;
        }

        IList lists = value as IList;
        if (lists == null)
        {
            backingStore.Add(prefix, value);
            return;
        }

        for (int i = 0; i < lists.Count; i++)
        {
            CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakeArrayKey(prefix, i), lists[i]);
        }
    }

    private class EntryLimitedDictionary
    {
        private static int _maximumDepth;

        private readonly IDictionary<string, object> _innerDictionary;

        private int _itemCount;

        static EntryLimitedDictionary()
        {
            _maximumDepth = CustomJsonValueProviderFactory.GetMaximumDepth();
        }

        public EntryLimitedDictionary(IDictionary<string, object> innerDictionary)
        {
            this._innerDictionary = innerDictionary;
        }

        public void Add(string key, object value)
        {
            int num = this._itemCount + 1;
            this._itemCount = num;
            if (num > _maximumDepth)
            {
                throw new InvalidOperationException("The length of the string exceeds the value set on the maxJsonLength property.");
            }
            this._innerDictionary.Add(key, value);
        }
    }

    private static string MakeArrayKey(string prefix, int index)
    {
        return string.Concat(prefix, "[", index.ToString(CultureInfo.InvariantCulture), "]");
    }

    private static string MakePropertyKey(string prefix, string propertyName)
    {
        if (string.IsNullOrEmpty(prefix))
        {
            return propertyName;
        }
        return string.Concat(prefix, ".", propertyName);
    }

    private static int GetMaximumDepth()
    {
        int num;
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers");
            if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
            {
                return num;
            }
        }
        return 1000;
    }

    private static int GetMaxJsonLength()
    {
        int num;
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonLength");
            if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
            {
                return num;
            }
        }
        return 1000;
    }
}

1
Teşekkürler çalışıyor ... Çok teşekkürler @Maxim Gershkovich
Jasper Manickaraj

1

WebForms UpdatePanel için çözüm:

Web.config dosyasına bir ayar ekleyin:

<configuration>
  <appSettings>
    <add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
  </appSettings>
</configuration>

https://support.microsoft.com/en-us/kb/981884

ScriptRegistrationManager sınıfı aşağıdaki kodu içerir:

// Serialize the attributes to JSON and write them out
JavaScriptSerializer serializer = new JavaScriptSerializer();

// Dev10# 877767 - Allow configurable UpdatePanel script block length
// The default is JavaScriptSerializer.DefaultMaxJsonLength
if (AppSettings.UpdatePanelMaxScriptLength > 0) {
    serializer.MaxJsonLength = AppSettings.UpdatePanelMaxScriptLength;
}  

string attrText = serializer.Serialize(attrs);

1

Herhangi bir sunucu tarafı değişikliğine ihtiyacımız yok. Bu düzeltmeyi yalnızca web.config dosyası ile değiştirebilirsiniz. Bu bana yardımcı oldu. bunu dene

<appSettings>
 <add key="aspnet:MaxJsonDeserializerMembers" value="2147483647" />
<add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
</appSettings>  

and   

<system.web.extensions>
<scripting>
  <webServices>
    <jsonSerialization maxJsonLength="2147483647"/>
  </webServices>
</scripting>


0

kullanım lib\Newtonsoft.Json.dll

public string serializeObj(dynamic json) {        
    return JsonConvert.SerializeObject(json);
}

0

ASP.NET MVC için düzeltme: sadece soruna neden olan belirli bir eylem için düzeltmek istiyorsanız, o zaman böyle kodlayın:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return Json(someBigObject);
}

bunu değiştirebilirsiniz:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return new JsonResult()
    {
        Data = someBigObject,
        JsonRequestBehavior = JsonRequestBehavior.DenyGet,
        MaxJsonLength = int.MaxValue
    };
}

Ve işlevsellik aynı olmalıdır, sadece yanıt olarak daha büyük JSON dönebilirsiniz.


ASP.NET MVC kaynak koduna dayalı Açıklama: ne kontrol edebilirsiniz Controller.Jsonyöntem ASP.NET MVC yaptığı kaynak kodu

protected internal JsonResult Json(object data)
{
    return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}

Başka bir Controller.Jsonyöntem çağırıyor :

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };
}

nerede geçti contentTypeve contentEncodingnesne null. Temelde return Json(object)kontrolörde çağrı yapmak çağrıyla eşdeğerdir return new JsonResult { Data = object, JsonRequestBehavior = sonRequestBehavior.DenyGet }. İkinci formu kullanabilir ve parametreleştirebilirsiniz JsonResult.

Peki MaxJsonLengthözelliği ayarladığınızda (varsayılan olarak boştur) ne olur ? Bu oluyor aşağı geçti için JavaScriptSerializer.MaxJsonLengthmülkiyet ve ardından JavaScriptSerializer.Serializeyöntemi olup adlandırılan :

JavaScriptSerializer serializer = new JavaScriptSerializer();
if (MaxJsonLength.HasValue)
{
    serializer.MaxJsonLength = MaxJsonLength.Value;
}

if (RecursionLimit.HasValue)
{
    serializer.RecursionLimit = RecursionLimit.Value;
}

response.Write(serializer.Serialize(Data));

Ve MaxJsonLenghtserileştiricinin özelliğini ayarlamazsanız , sadece 2MB olan varsayılan değeri alır .


-2

Bu maxJsonLength değeri bir int ise o zaman ne kadar büyük int 32bit / 64bit / 16bit .... ben sadece benim maxJsonLength olarak ayarlayabilir maksimum değeri ne olduğundan emin olmak istiyorum

<scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>

-4

Web.config ile yapmanız gerekmemektedir Geçen listenin catch değeri sırasında short özelliğini kullanabilirsiniz. Örneğin;

public class BookModel
    {
        public decimal id { get; set; }  // 1 

        public string BN { get; set; } // 2 Book Name

        public string BC { get; set; } // 3 Bar Code Number

        public string BE { get; set; } // 4 Edition Name

        public string BAL { get; set; } // 5 Academic Level

        public string BCAT { get; set; } // 6 Category
}

burada BC = barkod BE = kitap baskısı ve benzeri gibi kısa oranlar kullanıyorum


Verilerin büyük bir kısmı özellik değerlerinde ise bu yardımcı olmaz
Pencere
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.