W jednej z moich akcji kontrolera zwracam bardzo dużą, JsonResult
aby wypełnić siatkę.
Otrzymuję następujący InvalidOperationException
wyjątek:
Błąd podczas serializacji lub deserializacji przy użyciu JSON JavaScriptSerializer. Długość ciągu przekracza wartość ustawioną we właściwości maxJsonLength.
Ustawienie tej maxJsonLength
właściwości na web.config
wyższą wartość niestety nie daje żadnego efektu.
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"/>
</webServices>
</scripting>
</system.web.extensions>
Nie chcę przekazywać go z powrotem jako ciąg, jak wspomniano w tej odpowiedzi SO.
W swoich badaniach trafiłem na ten wpis na blogu, w którym napisanie własnego ActionResult
(np. LargeJsonResult : JsonResult
) Jest zalecane, aby ominąć to zachowanie.
Czy to jedyne rozwiązanie?
Czy to błąd w ASP.NET MVC?
Czy coś mi brakuje?
Każda pomoc będzie mile widziana.
źródło
Odpowiedzi:
Wygląda na to, że zostało to naprawione w MVC4.
Możesz to zrobić, co dla mnie zadziałało:
źródło
Możesz również użyć
ContentResult
zgodnie z sugestią tutaj zamiast podklasyJsonResult
.źródło
Niestety ustawienie web.config jest ignorowane przez domyślną implementację JsonResult . Więc myślę, że będziesz musiał zaimplementować niestandardowy wynik json, aby rozwiązać ten problem.
źródło
Nie ma potrzeby posiadania niestandardowej klasy. To wszystko, czego potrzeba:
gdzie
Result
są te dane, które chcesz serializować.źródło
Jeśli używasz Json.NET do generowania
json
ciągu, nie trzeba ustawiaćMaxJsonLength
wartości.źródło
Rozwiązałem problem, klikając ten link
źródło
Jestem zaskoczony, że nikt nie zasugerował użycia filtra wyników. To najczystszy sposób globalnego podłączenia się do potoku akcji / wyników:
Następnie zarejestruj instancję tej klasy za pomocą
GlobalFilters.Filters
:źródło
Możesz spróbować zdefiniować w wyrażeniu LINQ tylko te pola, które będą potrzebne.
Przykład. Wyobraź sobie, że masz model z identyfikatorem, nazwą, telefonem i obrazem (tablica bajtów) i musisz załadować z json do listy wyboru.
Zapytanie LINQ:
Problem polega na tym, że „ select u ” powoduje pobranie wszystkich pól. Więc jeśli masz duże zdjęcia, booomm.
Jak rozwiązać? bardzo, bardzo proste.
Najlepsze praktyki to wybór tylko tego pola, którego będziesz używać.
Zapamiętaj. To prosta wskazówka, ale może pomóc wielu programistom ASP.NET MVC.
źródło
Alternatywna poprawka ASP.NET MVC 5:
W moim przypadku błąd wystąpił podczas żądania. Najlepszym podejściem w moim scenariuszu jest modyfikacja rzeczywistego,
JsonValueProviderFactory
który stosuje poprawkę do projektu globalnego i można to zrobić, edytującglobal.cs
plik jako taki.dodaj wpis web.config:
a następnie utwórz dwie następujące klasy
Jest to w zasadzie dokładna kopia domyślnej implementacji znalezionej w programie,
System.Web.Mvc
ale z dodatkiem konfigurowalnej wartości appsetting web.configaspnet:MaxJsonLength
.źródło
Żadne z powyższych nie zadziałało, dopóki nie zmieniłem Akcji na
[HttpPost]
. i ustawiono typ AJAX jakoPOST
.A wywołanie AJAX jako
źródło
Czy była dla mnie poprawka w MVC 4.
źródło
Musisz ręcznie odczytać z sekcji konfiguracji, zanim kod zwróci obiekt JsonResult. Po prostu przeczytaj z web.config w jednej linii:
Upewnij się, że zdefiniowałeś element konfiguracji w web.config
źródło
to działało dla mnie
źródło
jest trochę inny przypadek - dane są przesyłane od klienta do serwera. gdy używasz metody kontrolera, a model jest ogromny:
system zgłasza wyjątek taki jak ten „Błąd podczas serializacji lub deserializacji przy użyciu JSON JavaScriptSerializer. Długość ciągu przekracza wartość ustawioną we właściwości maxJsonLength. Nazwa parametru: input”
Tylko zmiana ustawień Web.config nie wystarczy, aby pomóc w tym przypadku. Możesz dodatkowo zastąpić serializator mvc json do obsługi dużych rozmiarów modeli danych lub ręcznie deserializować model z Request. Twoja metoda kontrolera to:
źródło
Możesz umieścić ten kod w cshtml, jeśli zwracasz widok z kontrolera i chcesz zwiększyć długość danych widoku worka podczas kodowania w json w cshtml
Teraz
dataJsonOnActionGrid1
będzie dostępny na stronie js i uzyskasz właściwy wynik.Dzięki
źródło