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 maxJsonLength
in web.config
? Caso contrário, qual é o comprimento máximo que posso definir?
asp.net
asp.net-mvc
json
Prasad
fonte
fonte
Respostas:
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
MaxJsonLength
propriedade no seu web.config:fonte
2147483647
como @depsart e @ Descár apontam.return Json()
ou algoSe você estiver usando o MVC 4 , verifique também esta resposta .
Se você ainda estiver recebendo o erro:
maxJsonLength
propriedade com seu valor máximo em web.configseu problema é provável que:
Basicamente, o "interno"
JavaScriptSerializer
respeita o valor demaxJsonLength
quando chamado de um método da web; O uso direto de aJavaScriptSerializer
(ou o uso de um método de ação / Controller MVC) não respeita amaxJsonLength
propriedade, pelo menos não nasystemWebExtensions.scripting.webServices.jsonSerialization
seção web.config.Como solução alternativa, você pode fazer o seguinte no seu Controller (ou em qualquer outro lugar):
Esta resposta é a minha interpretação desta resposta do fórum asp.net .
fonte
Json()
método de resultado da ação no asp.net mvc.No MVC 4, você pode fazer:
no seu controlador.
Adição:
Para qualquer pessoa intrigada com os parâmetros que você precisa especificar, uma chamada pode ser assim:
fonte
Você pode configurar o comprimento máximo para solicitações json no seu arquivo web.config:
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
fonte
se você ainda estiver recebendo erro após a configuração do web.config da seguinte maneira:
Eu o resolvi seguindo:
Espero que isso ajude.
fonte
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:
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.
fonte
Eu consertei isso.
Funciona muito bem.
fonte
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
Em seguida, no método Application_Start de Global.asax.cs, substitua o ValueProviderFactory pelo novo:
fonte
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:fonte
<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/1você pode escrever esta linha no Controller
você também pode escrever esta linha em
web.config
`
Para estar do lado seguro, use os dois.
fonte
Se você estiver recebendo esse erro do MiniProfiler no MVC, poderá aumentar o valor configurando a propriedade
MiniProfiler.Settings.MaxJsonResponseSize
para o valor desejado. Por padrão, essa ferramenta parece ignorar o valor definido na configuração.Cortesia do mvc-mini-profiler .
fonte
Basta definir a propriedade MaxJsonLength no método Action do MVC
fonte
Sugiro configurá-lo para Int32.MaxValue.
fonte
Que tal algum atributo mágico?
Em seguida, você pode aplicá-lo globalmente usando a configuração de filtro global ou o controlador / ação.
fonte
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.
fonte
Você pode configurá-lo na configuração, como já foi dito, ou em uma instância individual do serializador, como:
fonte
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.
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.
fonte
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 .
fonte
fonte
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.
fonte
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:
Então, em vez de dizer:
Eu digo:
É muito simples. Então, em JavaScript, em vez disso:
Em vez disso, digo:
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.
fonte
Resolvi o problema adicionando este código:
fonte
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();
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
JsonValueProviderFactory
que aplica a correção ao projeto global e pode ser feito editando oglobal.cs
arquivo como tal.adicione uma entrada web.config:
e crie as duas classes a seguir
Esta é basicamente uma cópia exata da implementação padrão encontrada em,
System.Web.Mvc
mas com a adição de um valor configurável para o conjunto de aplicativos web.configaspnet:MaxJsonLength
.fonte
Solução para o WebForms UpdatePanel:
Adicione uma configuração ao Web.config:
https://support.microsoft.com/en-us/kb/981884
ScriptRegistrationManager
A classe contém o seguinte código:fonte
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
fonte
usar
lib\Newtonsoft.Json.dll
fonte
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:
você pode mudar para isso:
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.Json
método faz no código-fonte do ASP.NET MVCEstá chamando outro
Controller.Json
método:onde passado
contentType
econtentEncoding
objeto estãonull
. Então, basicamente, chamar oreturn Json(object)
controlador é equivalente a chamarreturn new JsonResult { Data = object, JsonRequestBehavior = sonRequestBehavior.DenyGet }
. Você pode usar o segundo formulário e parametrizarJsonResult
.Então, o que acontece quando você define a
MaxJsonLength
propriedade (por padrão, é nula)? É passado para aJavaScriptSerializer.MaxJsonLength
propriedade e oJavaScriptSerializer.Serialize
método é chamado :E quando você não definir
MaxJsonLenght
propriedade de serializer então ele toma valor padrão que é apenas 2MB.fonte
se esse valor maxJsonLength é um int, então qual é o tamanho dele?
fonte
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
aqui eu uso pequenas propriedades como BC = código de barras BE = edição de livros e assim por diante
fonte