Otrzymuję ten błąd:
Żądanie JSON było zbyt duże, aby można je było zdezrializować.
Oto scenariusz, w którym ma to miejsce. Mam klasę kraju, który posiada listę portów wysyłkowych tego kraju
public class Country
{
public int Id { get; set; }
public string Name { get; set; }
public List<Port> Ports { get; set; }
}
Korzystam z KnockoutJS po stronie klienta, aby upuszczać kaskadowo. Mamy więc zestaw dwóch list rozwijanych, przy czym pierwszy to kraj, a drugi to porty tego kraju.
Do tej pory wszystko działa dobrze, to mój skrypt po stronie klienta:
var k1 = k1 || {};
$(document).ready(function () {
k1.MarketInfoItem = function (removeable) {
var self = this;
self.CountryOfLoadingId = ko.observable();
self.PortOfLoadingId = ko.observable();
self.CountryOfDestinationId = ko.observable();
self.PortOfDestinationId = ko.observable();
};
k1.viewModel = function () {
var marketInfoItems = ko.observableArray([]),
countries = ko.observableArray([]),
saveMarketInfo = function () {
var jsonData = ko.toJSON(marketInfoItems);
$.ajax({
url: 'SaveMarketInfos',
type: "POST",
data: jsonData,
datatype: "json",
contentType: "application/json charset=utf-8",
success: function (data) {
if (data) {
window.location.href = "Fin";
} else {
alert("Can not save your market information now!");
}
},
error: function (data) { alert("Can not save your contacts now!"); }
});
},
loadData = function () {
$.getJSON('../api/ListService/GetCountriesWithPorts', function (data) {
countries(data);
});
};
return {
MarketInfoItems: marketInfoItems,
Countries: countries,
LoadData: loadData,
SaveMarketInfo: saveMarketInfo,
};
} ();
Problem pojawia się, gdy wybierany jest kraj taki jak Chiny, który ma wiele portów. Więc jeśli masz 3 lub 4 razy „Chiny” w swojej tablicy i chcę wysłać je na serwer, aby zapisać. Wystąpił błąd.
Co powinienem zrobić, aby temu zaradzić?
asp.net-mvc
knockout.js
Kayvan Karim
źródło
źródło
Odpowiedzi:
Aby rozwiązać problem, musisz dostosować właściwość maxJsonLength do wyższej wartościweb.config
.Ustaw wyższą wartość
aspnet:MaxJsonDeserializerMembers
w ustawieniach aplikacji:Jeśli te opcje nie działają, możesz spróbować utworzyć niestandardową fabrykę dostawców wartości json przy użyciu JSON.NET, jak określono w tym wątku .
źródło
aspnet:MaxJsonDeserializerMembers
też dla mnie pracował. Czy ktoś wie, gdzie to jest faktycznie udokumentowane?Jeśli nie chcesz zmieniać ustawienia globalnego w konfiguracji internetowej
Użycie ustawienia globalnego aktywuje duże odpowiedzi JSON w całej aplikacji, co może doprowadzić do ataku typu „odmowa usługi”.
Jeśli dozwolonych jest kilka lokalizacji wyboru, możesz bardzo szybko użyć innego serializatora json, używając metody Content w następujący sposób:
źródło