Intro:JsonMaxLength wyjątek na deserializacji dużą json obiektów
aplikacji sieciowej ASP.NET MVC 3, działanie sterownika, który przyjmuje wystąpienie POCO klasy modelu z (potencjalnie) dużym obszarze.
klasaModel:
public class View
{
[Required]
[RegularExpression(...)]
public object name { get; set; }
public object details { get; set; }
public object content { get; set; } // the problem field
}
Controller działanie:
[ActionName(...)]
[Authorize(...)]
[HttpPost]
public ActionResult CreateView(View view)
{
if (!ModelState.IsValid) { return /*some ActionResult here*/;}
... //do other stuff, create object in db etc. return valid result
}
Problem:
Skarga powinna być w stanie przyjąć duże obiekty JSON (co najmniej do setki megabajtów jedna prośba i to nie żart). Domyślnie spotkałem się z kilkoma ograniczeniami, takimi jak httpRuntime maxRequestLength
itd. - wszystkie rozwiązane z wyjątkiem MaxJsonLengh - co oznacza, że domyślny ValueProviderFactory dla JSON nie jest w stanie obsługiwać takich obiektów.
Tried:
Ustawianie
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483647"/>
</webServices>
</scripting>
</system.web.extensions>
- nie pomaga.
Tworzenie własną niestandardową ValueProviderFactory jak opisano w @ odpowiedź Darin tu:
JsonValueProviderFactory throws "request too large"
- również nie, bo nie mam możliwość korzystania Json.NET (z przyczyn nietechnicznych) . Próbowałem implementować poprawną deserializację tutaj, ale najwyraźniej jest to nieco ponad moją wiedzą (jeszcze). Byłem w stanie deserializować mój ciąg JSON do
Dictionary<String,Object>
tutaj, ale to nie jest to, czego chcę - chcę deserializować go do moich pięknych obiektów POCO i używać ich jako parametrów wejściowych dla akcji.
więc pytania:
- Każdy zna lepszy sposób rozwiązania problemu bez wdrożenia uniwersalny niestandardową ValueProviderFactory?
- Czy istnieje możliwość określenia, dla jakiego konkretnego kontrolera i działania chcę używać mojego niestandardowego ValueProviderFactory? Jeśli znam działania wcześniej niż będę w stanie deserializować JSON do POCO bez dużego kodowania w ValueProviderFactory ...
- Myślę także o implementacji niestandardowego ActionFiltra dla tego konkretnego problemu, ale myślę, że jest trochę brzydki.
Ktoś może zaproponować dobre rozwiązanie?
Jest wiele osób, które zajmują się tym tematem i jest to jedyne rozwiązanie, jakie mogłem znaleźć w mojej aplikacji MVC4. Dziękuję Ci! – stitz
Super! Działa świetnie do wiązania dużego obiektu Json. W przypadku żądań GET z dużym obiektem Json używam tutaj klasy: http://brianreiter.org/2011/01/03/custom-jsonresult-class-for-asp-net-mvc-to-avoid-maxjsonlength-exceeded -exception/ –
Jeśli masz problemy z publikowaniem dużych struktur Json nad postem ajaxowym do kontrolera MVC4, spróbuj tego przed innymi rzeczami. Próbowałem wielu innych aproaches bez powodzenia i tylko to uratowało mój tydzień. Wielkie dzięki @DarinDimitrov! –