Posso definir um comprimento ilimitado para maxJsonLength no web.config?

663

Estou usando o recurso de preenchimento automático do jQuery. Quando tento recuperar a lista de mais de 17000 registros (cada um não terá mais de 10 caracteres), está excedendo o comprimento e gera o erro:

Informações sobre a exceção:
Tipo de exceção: InvalidOperationException
Mensagem de exceção: Erro durante a serialização ou desserialização usando o JSON JavaScriptSerializer. O comprimento da cadeia excede o valor definido na propriedade maxJsonLength.

Posso definir um comprimento ilimitado para maxJsonLengthin web.config? Caso contrário, qual é o comprimento máximo que posso definir?

Prasad
fonte
1
Algo para mencionar que pode ser bastante óbvio, então, desculpe-me se você já pensou; a sequência Json também inclui os colchetes em torno de cada registro, as aspas em torno de cada nome de campo [e valor], bem como o nome e o valor do campo. Portanto, pode ser útil definir o nome do campo como um único caractere e também garantir que, se o valor não for uma sequência, defina o tipo de campo corretamente para que não contenha aspas.
MichaelJTaylor 3/16

Respostas:

720

NOTA: esta resposta se aplica apenas a serviços da Web, se você estiver retornando JSON de um método Controller, leia também esta resposta SO abaixo: https://stackoverflow.com/a/7207539/1246870


A propriedade MaxJsonLength não pode ser ilimitada, é uma propriedade inteira cujo padrão é 102400 (100k).

Você pode definir a MaxJsonLengthpropriedade no seu web.config:

<configuration> 
   <system.web.extensions>
       <scripting>
           <webServices>
               <jsonSerialization maxJsonLength="50000000"/>
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration> 
CMS
fonte
153
É um número inteiro de modo que o valor máximo que você pode definir é: 2147483644
David Espart
58
@despart: Você quer dizer 2 147 483 647.
Dercsár
6
@ kmcc049, IMO os valores não estão errados porque se você olhar para a pergunta, o OP não está perguntando "qual é o valor padrão de maxJsonLength?" (BTW, a segunda resposta mais votada é responder a essa pergunta errada), ele está tentando definir essa propriedade como "ilimitada", mas como é um número inteiro, o valor máximo possível é 2147483647como @depsart e @ Descár apontam.
CMS
11
Grande, mas a resposta de nota @ David Murdoch abaixo se você está tendo esse problema ao usar o MVC return Json()ou algo
BritishDeveloper
3
@ Dercsár: qual é o ponto? 2147483644 é o maior inteiro perfeitamente divisível por 1024.
naveen
461

Se você estiver usando o MVC 4 , verifique também esta resposta .


Se você ainda estiver recebendo o erro:

  • depois de definir a maxJsonLengthpropriedade com seu valor máximo em web.config
  • e você sabe que o comprimento dos seus dados é menor que esse valor
  • e você não está utilizando um método de serviço da web para a serialização JavaScript

seu problema é provável que:

O valor da propriedade MaxJsonLength se aplica apenas à instância JavaScriptSerializer interna usada pela camada de comunicação assíncrona para chamar métodos de serviços da Web. ( Propriedade MSDN: ScriptingJsonSerializationSection.MaxJsonLength )

Basicamente, o "interno" JavaScriptSerializerrespeita o valor de maxJsonLengthquando chamado de um método da web; O uso direto de a JavaScriptSerializer(ou o uso de um método de ação / Controller MVC) não respeita a maxJsonLengthpropriedade, pelo menos não na systemWebExtensions.scripting.webServices.jsonSerializationseção web.config.

Como solução alternativa, você pode fazer o seguinte no seu Controller (ou em qualquer outro lugar):

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;

Esta resposta é a minha interpretação desta resposta do fórum asp.net .

David Murdoch
fonte
5
Sua resposta foi realmente útil, pois estou usando o Json()método de resultado da ação no asp.net mvc.
jessegavin
3
Sim, eu também sofri com o Json (). Obrigado!
BritishDeveloper 13/03/12
3
Embora seja completamente correto e mereça o seu lugar, essa é uma daquelas perguntas em que vale a pena ler além da resposta principal :). Obrigado!
Nigel
3
Se você estiver usando o MVC4, consulte a resposta @fanisch também.
quer
4
E a desserialização? Eu encontrei esse erro na ligação do modelo da ação.
guogangj
345

No MVC 4, você pode fazer:

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

no seu controlador.

Adição:

Para qualquer pessoa intrigada com os parâmetros que você precisa especificar, uma chamada pode ser assim:

Json(
    new {
        field1 = true,
        field2 = "value"
        },
    "application/json",
    Encoding.UTF8,
    JsonRequestBehavior.AllowGet
);
fanisch
fonte
6
Posso confirmar que o acima funciona como um encanto no MVC 4, obrigado fanisch.
quer
9
Eu posso confirmar também. Colocar esse código dentro de um controlador básico é definitivamente a abordagem mais limpa proposta.
parlamento
15
Isso também funciona adicionando "MaxJsonLength = Int32.MaxValue" ao resultado da ação individual. Caso a alteração não seja desejada, o controlador ou o projeto será amplo.
Hipnovírus
3
Esta é a melhor resposta. O MaxJsonLength pode ser configurado por controlador.
Liang
3
AVISO: esta solução desabilita a compactação (se solicitada) da resposta. Adicione este filtro à sua ação: stackoverflow.com/questions/3802107/…
Gorgi Rankovski
60

Você pode configurar o comprimento máximo para solicitações json no seu arquivo web.config:

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

O valor padrão para maxJsonLength é 102400 . Para obter mais detalhes, consulte esta página do MSDN: http://msdn.microsoft.com/en-us/library/bb763183.aspx

M4N
fonte
1
Qual é o valor armazenado neste número inteiro? Isso é algum tipo de contagem de caracteres? Acho que o que estou perguntando é: por que um número inteiro está sendo usado? Obrigado!
eaglei22
@ eaglei22, o número representa quantos bytes podem ser usados ​​para o maxJsonLength. Como o M4N mencionou, 102400 é o padrão (100 KB).
27675 Jacob Plonke
isso não funcionou para mim e eu não usei webservices.
kalai
42

se você ainda estiver recebendo erro após a configuração do web.config da seguinte maneira:

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

Eu o resolvi seguindo:

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

Espero que isso ajude.

Ravi Anand
fonte
2
Definir o maxJsonLength no web.config é unnesseary, definindo o jsonResult.MaxJsonLength deve ser suficiente (pelo menos ele fez por mim (MVC5))
hormberg
Isso é bom porque não é uma mudança global.
rob_james 22/01
40

Eu estava tendo esse problema no ASP.NET Web Forms. Ele estava ignorando completamente as configurações do arquivo web.config, então eu fiz isso:

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

Obviamente, no geral, essa é uma prática terrível. Se você está enviando tantos dados em uma chamada de serviço da web, deve considerar uma abordagem diferente.

Pulga
fonte
1
Isso funcionou para você? onde você colocou esse código?
user1012598
Nosso problema foi porque tínhamos uma área de texto que permitia HTML e as pessoas incorporavam imagens como HTML, o que fazia com que a entrada se tornasse muito grande e o serializador JSON falhasse. Eu acho que se isso pode ser feito usuários irão fazê-lo ...
Marko
Por favor, descreva onde devemos colocar esse código ... @Flea #
Koray Durudogan
@KorayDurudogan - coloquei isso no método Ajax que estava retornando a resposta, no meu controlador. Espero que ajude!
Flea
Não estou desafiando sua resposta, mas tentando ter uma idéia melhor de quais são as melhores abordagens. Eu tenho uma consulta que, dependendo de quais são os critérios do usuário, determinará o tamanho do resultado. Eu retorno um JsonResult, importaria se eu retornasse um arquivo do Excel?
eaglei22
22

Eu consertei isso.

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

Funciona muito bem.

Mario Arrieta
fonte
Impressionante! Esta é a única solução que funcionou para mim e é melhor de qualquer maneira, já que não é uma mudança global. Obrigado!
Sealer_05
20

Segui a resposta da Vestigal e cheguei a esta solução:

Quando eu precisava postar um json grande em uma ação em um controlador, recebia o famoso "Erro durante a desserialização usando o JSON JavaScriptSerializer. O comprimento da string excede o valor definido na propriedade maxJsonLength. \ R \ nNome do parâmetro: input provedor de valor ".

O que fiz foi criar um novo ValueProviderFactory, LargeJsonValueProviderFactory e definir o MaxJsonLength = Int32.MaxValue no método GetDeserializedObject

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

Em seguida, no método Application_Start de Global.asax.cs, substitua o ValueProviderFactory pelo novo:

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);
}
MFA
fonte
1
Eu fiz tudo o que posso, apenas sua resposta salvou meu dia, isso deveria ter sido aceito resposta #
Muhammad Waqas Aziz
Com esse código, somos capazes de substituir controlador MVC limite json Deserializetion máximo de 4 mb, mas há uma maneira para substituir controlador de web-api limite Deserializetion max json
Muhammad Waqas Aziz
17

se, depois de implementar a adição acima em seu web.config, você obtiver uma "seção de configuração não reconhecida system.web.extensions". erro, tente adicionar isso ao seu web.config na <ConfigSections>seção:

            <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>
bkdraper
fonte
4
Eu estava tendo esse problema. No entanto, esta resposta não funcionou para mim. Em vez de adicionar o elemento <sectionGroup> descrito aqui, movi todo o bloco <system.web.extensions> recém-adicionado ao final do meu web.config ... logo antes de </configuration>. Então funcionou.
ClassCloud8
Isso ajudou, mas na minha situação eu precisava para mudar a sua quarta linha para <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>, como visto nessa página: forums.asp.net/t/1446510.aspx/1
Nathan
@ ClearCloud8 Obtenha esse comentário espalhado por esta página imediatamente.
Jack Nutkins
11

você pode escrever esta linha no Controller

json.MaxJsonLength = 2147483644;

você também pode escrever esta linha em web.config

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

`

Para estar do lado seguro, use os dois.

Pankaj Sapkal
fonte
10

Se você estiver recebendo esse erro do MiniProfiler no MVC, poderá aumentar o valor configurando a propriedade MiniProfiler.Settings.MaxJsonResponseSizepara o valor desejado. Por padrão, essa ferramenta parece ignorar o valor definido na configuração.

MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

Cortesia do mvc-mini-profiler .

wolfyuk
fonte
10

Basta definir a propriedade MaxJsonLength no método Action do MVC

JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet);
json.MaxJsonLength = int.MaxValue;
return json;
Aftab Ahmed Kalhoro
fonte
9

Sugiro configurá-lo para Int32.MaxValue.

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;
Santhosh
fonte
9

Que tal algum atributo mágico?

[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;
            }
        }
    }
}

Em seguida, você pode aplicá-lo globalmente usando a configuração de filtro global ou o controlador / ação.

Balázs
fonte
Ótima resposta. Bom uso de atributos personalizados. Quer saber se existe um motivo (técnico) específico para definir o padrão como 10 MB no valor de caracteres de um byte em vez do Max (int.MaxValue)?
Josh
@ Josh Não, não havia nenhuma razão especial para isso.
Balázs
5

A questão realmente é se você realmente precisa retornar 17k registros? Como você planeja lidar com todos os dados no navegador? Os usuários não vão rolar pelas 17000 linhas de qualquer maneira.

Uma abordagem melhor é recuperar apenas os "poucos poucos" registros e carregar mais conforme necessário.

Chetan Sastry
fonte
1
A lista padrão do json fornecerá 17k registros. Mas o recurso de preenchimento automático listará apenas os registros que correspondem aos caracteres digitados pelo usuário, portanto, não será necessário rolar mais a lista. Então, o que eu preciso é definir um comprimento ilimitado para maxJsonLength, que pode serializar os dados de 17k.
Prasad
6
Você pode usar uma combinação de filtragem do servidor e do cliente. Pode ser difícil filtrar todos os dados no lado do cliente, sem mencionar a latência da rede.
Chetan Sastry
1
Tendo chegado a esse mesmo problema há um tempo, optei por implementar um manipulador de "pesquisa" para o preenchimento automático e fazer com que a chamada de serviço da Web passe o texto "pesquisar" e faça uma consulta Top10 usando os critérios de pesquisa como filtro. Isso significava solicitações ajax mais individuais, que apenas obtinham a lista completa no carregamento da página, mas também significava que todas as solicitações / respostas eram muito menores.
Mike L
3

Você pode configurá-lo na configuração, como já foi dito, ou em uma instância individual do serializador, como:

var js = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue };
Caleb Postlethwait
fonte
3

Para aqueles que estão tendo problemas no MVC3 com JSON que estão sendo desserializados automaticamente para um fichário de modelo e são muito grandes, aqui está uma solução.

  1. Copie o código da classe JsonValueProviderFactory do código-fonte MVC3 para uma nova classe.
  2. Adicione uma linha para alterar o comprimento máximo do JSON antes que o objeto seja desserializado.
  3. Substitua a classe JsonValueProviderFactory pela sua nova classe modificada.

Agradeço a http://blog.naver.com/techshare/100145191355 e https://gist.github.com/DalSoft/1588818 por me indicar a direção certa de como fazer isso. O último link no primeiro site contém o código fonte completo da solução.

vestigal
fonte
3

Se você encontrar esse tipo de problema no modo de exibição, use o método abaixo para resolver isso. Aqui usei o pacote Newtonsoft .

@using Newtonsoft.Json
<script type="text/javascript">
    var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part));
</script>
dush88c
fonte
Isso significa que não preciso me preocupar com o tamanho máximo se usar o Json.NET? Eu não acho que existe uma maneira de definir o comprimento máximo no Json.NET, então espero que funcione imediatamente.
kimbaudi
1
Excelente resposta obrigado! Isso também funcionou quando eu estava tentando carregar um objeto.
user1299379 7/01
3
 JsonResult result = Json(r);
 result.MaxJsonLength = Int32.MaxValue;
 result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 return result;
Aikansh Mann
fonte
2

Parece que não há valor "ilimitado". O padrão é 2097152 caracteres, o que equivale a 4 MB de dados da cadeia Unicode.

Como já foi observado, 17.000 registros são difíceis de usar bem no navegador. Se você estiver apresentando uma exibição agregada, pode ser muito mais eficiente fazer a agregação no servidor e transferir apenas um resumo no navegador. Por exemplo, considere um navegador de sistema de arquivos, vemos apenas o topo da árvore e emitimos solicitações adicionais à medida que expandimos. O número de registros retornados em cada solicitação é comparativamente pequeno. Uma apresentação em exibição em árvore pode funcionar bem para grandes conjuntos de resultados.

djna
fonte
3
estranhamente, o padrão no código (new JavaScriptSerializer ()). MaxJsonLength é 2097152 bytes, mas o serviço da Web ResponseFormatJson é 102400 bytes, a menos que seja explicitamente definido.
rob
2

Apenas me deparei com isso. Estou recebendo mais de 6.000 registros. Acabei de decidir que faria apenas uma paginação. Por exemplo, aceito um número de página no meu ponto de extremidade MVC JsonResult, que é padronizado como 0, portanto não é necessário, como:

public JsonResult MyObjects(int pageNumber = 0)

Então, em vez de dizer:

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

Eu digo:

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

É muito simples. Então, em JavaScript, em vez disso:

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

Em vez disso, digo:

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

E anexe seus registros ao que você estava fazendo com eles em primeiro lugar. Ou apenas espere até que todas as chamadas terminem e junte os resultados.

vbullinger
fonte
2

Resolvi o problema adicionando este código:

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();
jfabrizio
fonte
Parece uma solução hackiana, mas de qualquer maneira uma abordagem interessante. Achei útil obrigado! Para mim, no apsnet mvc 5 controller, tive que remover 'Current' do namespace. Fiz alguns ajustes: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 19/03/16
2

Correção alternativa do ASP.NET MVC 5:

(A minha é semelhante à resposta dos MFCs acima com algumas pequenas alterações)

Ainda não estava pronto para mudar para o Json.NET e, no meu caso, o erro estava ocorrendo durante a solicitação. A melhor abordagem no meu cenário foi modificar o real JsonValueProviderFactoryque aplica a correção ao projeto global e pode ser feito editando o global.csarquivo como tal.

JsonValueProviderConfig.Config(ValueProviderFactories.Factories);

adicione uma entrada web.config:

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

e crie as duas classes a seguir

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

Esta é basicamente uma cópia exata da implementação padrão encontrada em, System.Web.Mvcmas com a adição de um valor configurável para o conjunto de aplicativos web.config 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;
    }
}
Maxim Gershkovich
fonte
1
Graças Está funcionando ... Muito obrigado @Maxim Gershkovich
Jasper Manickaraj
1

Solução para o WebForms UpdatePanel:

Adicione uma configuração ao Web.config:

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

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

ScriptRegistrationManager A classe contém o seguinte código:

// 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);
Der_Meister
fonte
1

Não precisamos de nenhuma alteração no lado do servidor. você pode corrigir isso apenas modificar pelo arquivo web.config Isso me ajudou. tente isso

<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>

isanka thalagala
fonte
0

usar lib\Newtonsoft.Json.dll

public string serializeObj(dynamic json) {        
    return JsonConvert.SerializeObject(json);
}
Buddhika De Silva
fonte
0

Correção para o ASP.NET MVC: se você deseja corrigi-lo apenas para uma ação específica que está causando o problema, codifique assim:

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

você pode mudar para isso:

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

E a funcionalidade deve ser a mesma, você pode retornar JSON maior como resposta.


Explicação baseada no código-fonte do ASP.NET MVC: você pode verificar o que o Controller.Jsonmétodo faz no código-fonte do ASP.NET MVC

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

Está chamando outro Controller.Jsonmétodo:

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

onde passado contentTypee contentEncodingobjeto estão null. Então, basicamente, chamar o return Json(object)controlador é equivalente a chamar return new JsonResult { Data = object, JsonRequestBehavior = sonRequestBehavior.DenyGet }. Você pode usar o segundo formulário e parametrizar JsonResult.

Então, o que acontece quando você define a MaxJsonLengthpropriedade (por padrão, é nula)? É passado para a JavaScriptSerializer.MaxJsonLengthpropriedade e o JavaScriptSerializer.Serializemétodo é chamado :

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

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

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

E quando você não definir MaxJsonLenghtpropriedade de serializer então ele toma valor padrão que é apenas 2MB.

Mariusz Pawelski
fonte
-2

se esse valor maxJsonLength é um int, então qual é o tamanho dele?

<scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>
mpho isaac Molelle
fonte
-4

Você não precisa fazer web.config Você pode usar a propriedade short durante o valor catch da lista de aprovação. Por exemplo, declare um modelo como

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
}

aqui eu uso pequenas propriedades como BC = código de barras BE = edição de livros e assim por diante

Md Nazrul Islam
fonte
Isso não ajudará se a maior parte dos dados estiver nos valores da propriedade
Janela