字符串的长度超过了mvc中maxjsonlength属性上设置的值

vID*_*DHU -1 c# ajax asp.net-mvc jsonresult

我正在使用ajax呼叫来获取车辆旅行详细信息。因此,当从控制器返回行程详细信息以查看时,出现了错误“字符串的长度超过了在maxjsonlength属性上设置的值”。

下面给出的是我用来获取行程详细信息的ajax调用。每当行程细节很大时,都会进入误差函数。

    function LoadTripModalWindow(masterID, headwayPlanID, version, specialDay, applicableDay) {
        //change this value after cpp service implementation
        //version = 1;
        /////////////////
       if (headwayPlanID == 0 || headwayPlanID == null) {
            $('#HeadwayPopUp').hide();
            $('#NoTripGenerated').hide();
            $('#NoHeadwayPopUp').show();
        }
        else {
            $('#tripDialogDiv').hide();
            $('#NoHeadwayPopUp').hide();
            $.blockUI({ message: $('#msthrobber') });
            var tripIn = '';
            tripIn = '<table class="table table-bordered trip" id="tripInTableMS"> </table>';
            $("#tripInTableMS").remove();
            $("#TripIn").append(tripIn);
            var tripOut = '';
            tripOut = '<table class="table table-bordered trip" id="tripOutTableMS"> </table>';
            $("#tripOutTableMS").remove();
            $("#TripOut").append(tripOut);
            $.ajax({
                type: "GET",
                url: "/ScheduleManagement/MasterConfiguration/GetTripTableDetails/",
                data: { version: version, masterScheduleID: masterID, headwayPlanId: headwayPlanID, applicableDay: applicableDay, specialDay: specialDay },
                dataType: "json",
                context: this,
                success: function (data) {
                    var returnedData = JSON.parse(data);
                    var tripIn = returnedData.TripIn;
                    var tripOut = returnedData.TripOut;
                    var TripInHeadwayPlan = returnedData.TripInHeadwayPlan;
                    var TripOutHeadwayPlan = returnedData.TripOutHeadwayPlan;
                    var TripInRoute = returnedData.TripInRoute;
                    var TripOutRoute = returnedData.TripOutRoute;
                    var ShiftDetails = returnedData.AssignedShifts;
                    if ((tripIn == null || tripIn.length == 0) && (tripOut == null || tripOut.length == 0)) {
                        //if (tripIn == null && tripOut == null) {

                        $.unblockUI();
                        $('#tripDialogDiv').show();
                        $('#HeadwayPopUp').hide();
                        $('#NoTripGenerated').show();
                    }
                    else {
                        var shiftDetail = '<label"> Shift Details :</label>&nbsp;&nbsp;&nbsp;';
                        for (var s = 0; s < ShiftDetails.length; s++) {
                            shiftDetail += '&nbsp;<input type="text" class="shift-details  Shift' + (parseInt(s) + 1) + ' " disabled>' +
                             '<label  style="color: slategrey;">' + ShiftDetails[s].shiftName + '(' + ShiftDetails[s].startTime.substring(0, 5) + ' - ' + ShiftDetails[s].endTime.substring(0, 5) + ')</label> &nbsp; &nbsp;';
                        }
                        $("#ShiftDetails").html('');
                        $("#ShiftDetails").append(shiftDetail);
                        if (tripIn != null) {
                            var tripInTable = new triptable('tripInTableMS', '0', 'btnAddCol1', 'btnTripSave', 'btnTrip1Remove', tripIn, TripInHeadwayPlan, TripInRoute, TripOutRoute, ShiftDetails);
                        }
                        if (tripOut != null) {
                            var tripOutTable = new triptable('tripOutTableMS', '1', 'btnAddCol2', 'btnTripSave', 'btnTrip2Remove', tripOut, TripOutHeadwayPlan, TripInRoute, TripOutRoute, ShiftDetails);
                        }
                        $.unblockUI();
                        $('#tripDialogDiv').show();
                        $('#HeadwayPopUp').show();
                        $('#NoTripGenerated').hide();
                        $("#TripInBox").show();
                        $("#TripOutBox").hide();
                    }
                },
                error: function (response) {
                    alert("error : " + response);
                }
            });
        }
    }
Run Code Online (Sandbox Code Playgroud)

我在应用程序中添加了以下代码。

 private static void AddToBackingStore(JsonDotNetValueProviderFactory.EntryLimitedDictionary backingStore, string prefix, object value)
        {
            IDictionary<string, object> dictionary = value as IDictionary<string, object>;
            if (dictionary != null)
            {
                foreach (KeyValuePair<string, object> keyValuePair in (IEnumerable<KeyValuePair<string, object>>)dictionary)
                    JsonDotNetValueProviderFactory.AddToBackingStore(backingStore, JsonDotNetValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);
            }
            else
            {
                IList list = value as IList;
                if (list != null)
                {
                    for (int index = 0; index < list.Count; ++index)
                        JsonDotNetValueProviderFactory.AddToBackingStore(backingStore, JsonDotNetValueProviderFactory.MakeArrayKey(prefix, index), list[index]);
                }
                else
                    backingStore.Add(prefix, value);
            }
        }

        private static object GetDeserializedObject(ControllerContext controllerContext)
        {
            if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
                return (object)null;
            string end = new StreamReader(controllerContext.HttpContext.Request.InputStream).ReadToEnd();
            if (string.IsNullOrEmpty(end))
                return (object)null;

            var serializer = new JavaScriptSerializer { MaxJsonLength = Int32.MaxValue };

            return serializer.DeserializeObject(end);
        }
        public override IValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            if (controllerContext == null)
                throw new ArgumentNullException("controllerContext");
            object deserializedObject = JsonDotNetValueProviderFactory.GetDeserializedObject(controllerContext);
            if (deserializedObject == null)
                return (IValueProvider)null;
            Dictionary<string, object> dictionary = new Dictionary<string, object>((IEqualityComparer<string>)StringComparer.OrdinalIgnoreCase);
            JsonDotNetValueProviderFactory.AddToBackingStore(new JsonDotNetValueProviderFactory.EntryLimitedDictionary((IDictionary<string, object>)dictionary), string.Empty, deserializedObject);
            return (IValueProvider)new DictionaryValueProvider<object>((IDictionary<string, object>)dictionary, CultureInfo.CurrentCulture);

        }
        private static string MakeArrayKey(string prefix, int index)
        {
            return prefix + "[" + index.ToString((IFormatProvider)CultureInfo.InvariantCulture) + "]";
        }

        private static string MakePropertyKey(string prefix, string propertyName)
        {
            if (!string.IsNullOrEmpty(prefix))
                return prefix + "." + propertyName;
            return propertyName;
        }

        private class EntryLimitedDictionary
        {
            private static int _maximumDepth = JsonDotNetValueProviderFactory.EntryLimitedDictionary.GetMaximumDepth();
            private readonly IDictionary<string, object> _innerDictionary;
            private int _itemCount;

            public EntryLimitedDictionary(IDictionary<string, object> innerDictionary)
            {
                this._innerDictionary = innerDictionary;
            }

            public void Add(string key, object value)
            {
                if (++this._itemCount > JsonDotNetValueProviderFactory.EntryLimitedDictionary._maximumDepth)
                    throw new InvalidOperationException("JsonValueProviderFactory_RequestTooLarge");
                this._innerDictionary.Add(key, value);
            }

            private static int GetMaximumDepth()
            {
                NameValueCollection appSettings = ConfigurationManager.AppSettings;
                if (appSettings != null)
                {
                    string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers");
                    int result;
                    if (values != null && values.Length > 0 && int.TryParse(values[0], out result))
                        return result;
                }
                return 1000;
            }
        }
Run Code Online (Sandbox Code Playgroud)

在global.ascx文件中,我在下面添加了几行

  foreach (var factory in ValueProviderFactories.Factories)
            {
                if (factory.GetType().FullName == "System.Web.Mvc.JsonValueProviderFactory")
                {
                    jsonFactory = factory;
                    break;
                }
            }

            if (jsonFactory != null)
            {
                ValueProviderFactories.Factories.Remove(jsonFactory);
            }

            ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory());
Run Code Online (Sandbox Code Playgroud)

几个月工作正常。现在,数据长度再次增加,并再次开始出现错误。

如果有人有解决此问题的建议,请告诉我。

Aja*_*707 6

Json结果具有一些默认长度。只要超过,就会抛出错误。

为此,您有2种方法或者在web.config中添加长度,或者在返回操作方法时定义长度。

用于Web.config

<configuration> 
   <system.web.extensions>
       <scripting>
           <webServices>
               <jsonSerialization maxJsonLength="50000000"/>
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration> 
Run Code Online (Sandbox Code Playgroud)

或在返回jsonresult时,将length定义为字符串的最大长度。

return new JsonResult()
            {
                ContentEncoding = Encoding.Default,
                ContentType = "application/json",
                Data = data,
                JsonRequestBehavior = requestBehavior,
                MaxJsonLength = int.MaxValue
            };
Run Code Online (Sandbox Code Playgroud)

请参阅 字符串的长度超过在maxJsonLength属性上设置的值

我可以在web.config中为maxJsonLength设置无限长度吗?