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?


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> 

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 .


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

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


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.


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.


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.


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

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>

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.


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 .


10

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

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

9

Sugiro configurá-lo para Int32.MaxValue.

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

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.


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


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

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.


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>

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;

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.


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.


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

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

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

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>


0

usar lib\Newtonsoft.Json.dll

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

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.


-2

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

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

-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


Isso não ajudará se a maior parte dos dados estiver nos valores da propriedade
Janela
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.