Em uma das ações do meu controlador, estou retornando um valor muito grande JsonResult
para preencher uma grade.
Estou recebendo a seguinte InvalidOperationException
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.
Definir a maxJsonLength
propriedade em web.config
um valor mais alto, infelizmente, não mostra nenhum efeito.
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"/>
</webServices>
</scripting>
</system.web.extensions>
Não quero devolvê-lo como uma string, como mencionado nesta resposta do SO.
Na minha pesquisa, me deparei com este post do blog onde escrever um próprio ActionResult
(por exemplo LargeJsonResult : JsonResult
) é recomendado para contornar esse comportamento.
Essa é a única solução?
Isso é um bug no asp.net MVC?
Estou esquecendo de algo?
Qualquer ajuda seria muito apreciada.
fonte
Respostas:
Parece que isso foi corrigido no MVC4.
Você pode fazer isso, o que funcionou bem para mim:
fonte
Você também pode usar
ContentResult
como sugerido aqui, em vez de subclassificarJsonResult
.fonte
Infelizmente, a configuração web.config é ignorada pela implementação padrão do JsonResult . Então, acho que você precisará implementar um resultado json personalizado para superar esse problema.
fonte
Não há necessidade de uma classe personalizada. Isso é tudo o que é necessário:
onde
Result
estão os dados que você deseja serializar.fonte
Se você usar o Json.NET para gerar a
json
string, ele não precisará definirMaxJsonLength
valor.fonte
Resolvi o problema seguindo este link
fonte
Estou surpreso que ninguém tenha sugerido o uso de um filtro de resultados. Esta é a maneira mais limpa de se conectar globalmente ao pipeline de ação / resultado:
Em seguida, registre uma instância dessa classe usando
GlobalFilters.Filters
:fonte
Você pode tentar definir na sua expressão LINQ apenas os campos que você precisará.
Exemplo. Imagine que você tem um modelo com ID, nome, telefone e imagem (matriz de bytes) e precisa carregar do json em uma lista de seleção.
Consulta LINQ:
O problema aqui é " selecione u " que obtém todos os campos. Então, se você tem fotos grandes, booomm.
Como resolver? muito, muito simples
As práticas recomendadas são selecionar apenas o campo que você usará.
Lembrar. Esta é uma dica simples, mas pode ajudar muitos desenvolvedores do ASP.NET MVC.
fonte
Correção alternativa do ASP.NET MVC 5:
No meu caso, o erro estava ocorrendo durante a solicitação. A melhor abordagem no meu cenário é 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 de websconfig appsettingaspnet:MaxJsonLength
.fonte
Nenhuma das opções acima funcionou para mim até eu alterar a ação como
[HttpPost]
. e fez o tipo ajax comoPOST
.E o ajax chama como
fonte
Foi a correção para mim no MVC 4.
fonte
Você precisa ler a seção de configuração manualmente antes de seu código retornar um objeto JsonResult. Basta ler o web.config em uma única linha:
Certifique-se de definir o elemento de configuração em web.config
fonte
isso funcionou para mim
fonte
existe outro caso - os dados são enviados do cliente para o servidor. quando você está usando o método do controlador e o modelo é enorme:
O sistema lança uma exceção como esta "Erro durante a serialização ou desserialização usando o JSON JavaScriptSerializer. O comprimento da cadeia excede o valor definido na propriedade maxJsonLength. Nome do parâmetro: input"
Apenas alterar as configurações do Web.config não é suficiente para ajudar nesse caso. Além disso, você pode substituir o mvc json serializer para oferecer suporte a grandes tamanhos de modelo de dados ou desserializar manualmente o modelo de Request. Seu método de controle se torna:
fonte
Você pode colocar esse código em cshtml se estiver retornando a visualização do controlador e desejar aumentar o comprimento dos dados da bolsa de visualização enquanto codifica em json em cshtml
Agora,
dataJsonOnActionGrid1
será acessível na página js e você obterá o resultado adequado.obrigado
fonte