Tôi có thể đặt độ dài không giới hạn cho maxJsonLpm trong web.config không?


662

Tôi đang sử dụng tính năng tự động hoàn tất của jQuery. Khi tôi cố gắng truy xuất danh sách hơn 17000 bản ghi (mỗi bản ghi sẽ không có hơn 10 char), nó vượt quá độ dài và gây ra lỗi:

Thông tin ngoại lệ:
Loại ngoại lệ: UnlimitedOperationException
Thông báo ngoại lệ: Lỗi trong quá trình tuần tự hóa hoặc giải tuần tự hóa bằng cách sử dụng JSON JavaScriptSerializer. Độ dài của chuỗi vượt quá giá trị được đặt trên thuộc tính maxJsonLpm.

Tôi có thể đặt một chiều dài không giới hạn cho maxJsonLengthtrong web.config? Nếu không, độ dài tối đa tôi có thể đặt là bao nhiêu?


1
Một cái gì đó để đề cập đến có thể khá rõ ràng vì vậy xin vui lòng cho tôi biết nếu bạn đã nghĩ nếu nó; chuỗi Json cũng bao gồm các dấu ngoặc nhọn xung quanh mỗi bản ghi, dấu ngoặc kép quanh mỗi tên trường [và giá trị], cũng như tên và giá trị của trường. Vì vậy, có thể hữu ích khi đặt tên trường là một ký tự đơn và cũng đảm bảo rằng nếu giá trị không phải là một chuỗi, bạn đặt loại trường chính xác để nó không chứa dấu ngoặc kép.
MichaelJTaylor

Câu trả lời:


719

LƯU Ý: câu trả lời này chỉ áp dụng cho các dịch vụ Web, nếu bạn đang trả về JSON từ phương thức Trình điều khiển, hãy đảm bảo bạn cũng đọc câu trả lời SO này bên dưới: https://stackoverflow.com/a/7207539/1246870


Các MaxJsonLength bất động sản không thể không giới hạn, là một tài sản số nguyên mặc định là 102.400 (100k).

Bạn có thể đặt thuộc MaxJsonLengthtính trên web.config:

<configuration> 
   <system.web.extensions>
       <scripting>
           <webServices>
               <jsonSerialization maxJsonLength="50000000"/>
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration> 

153
Đây là một số nguyên nên giá trị tối đa bạn có thể đặt là: 2147483644
David Espart

57
@despart: Ý bạn là 2 147 483 647.
Dercsár

6
@ kmcc049, IMO các giá trị không sai vì nếu bạn nhìn vào câu hỏi, OP không hỏi "giá trị mặc định của maxJsonLpm là gì?" (BTW, thứ hai hầu hết các bình chọn câu trả lời là trả lời này, câu hỏi sai), ông đang cố gắng để thiết lập thuộc tính này để "không giới hạn", nhưng vì là một Integer, các tối đa giá trị có thể là 2147483647như @depsart và @ DESCAR điểm ra.
CMS

11
Tuyệt vời nhưng lưu ý câu trả lời của @David Murdoch bên dưới nếu bạn gặp vấn đề này khi sử dụng MVC return Json()hoặc một cái gì đó
BritishDeveloper

3
@ Dercsár: điểm gì? 2147483644 là số nguyên lớn nhất chia hết cho 1024.
naveen

460

Nếu bạn đang sử dụng MVC 4 , hãy chắc chắn kiểm tra câu trả lời này .


Nếu bạn vẫn nhận được lỗi:

  • sau khi đặt thuộc maxJsonLengthtính thành giá trị tối đa của nó trong web.config
  • và bạn biết rằng độ dài dữ liệu của bạn nhỏ hơn giá trị này
  • và bạn không sử dụng phương thức dịch vụ web để tuần tự hóa JavaScript

vấn đề của bạn có khả năng là:

Giá trị của thuộc tính MaxJsonLpm chỉ áp dụng cho phiên bản JavaScriptSerializer bên trong được sử dụng bởi lớp giao tiếp không đồng bộ để gọi các phương thức dịch vụ Web. ( MSDN: ScriptingJsonSerializationSection.MaxJsonLpm Thuộc tính )

Về cơ bản, "nội bộ" JavaScriptSerializertôn trọng giá trị maxJsonLengthkhi được gọi từ một phương thức web; việc sử dụng trực tiếp một JavaScriptSerializer(hoặc sử dụng thông qua một phương thức / bộ điều khiển hành động MVC) không tôn trọng thuộc maxJsonLengthtính, ít nhất là không phải từ systemWebExtensions.scripting.webServices.jsonSerializationphần của web.config.

Như một giải pháp thay thế, bạn có thể thực hiện các thao tác sau trong Bộ điều khiển của mình (hoặc bất kỳ nơi nào thực sự):

var serializer = new JavaScriptSerializer();

// For simplicity just use Int32's max value.
// You could always read the value from the config section mentioned above.
serializer.MaxJsonLength = Int32.MaxValue;

var resultData = new { Value = "foo", Text = "var" };
var result = new ContentResult{
    Content = serializer.Serialize(resultData),
    ContentType = "application/json"
};
return result;

Câu trả lời này là giải thích của tôi về câu trả lời diễn đàn asp.net này .


5
Câu trả lời của bạn thực sự hữu ích vì tôi đang sử dụng Json()phương pháp kết quả hành động trong asp.net mvc.
jliegavin

3
Yep tôi là một Json () quá đau khổ. Cảm ơn!
Anh

3
Mặc dù nó hoàn toàn chính xác và xứng đáng với vị trí của nó, đây là một trong những câu hỏi đáng để đọc qua câu trả lời hàng đầu :). Cảm ơn!
Nigel

3
Nếu bạn đang sử dụng MVC4, vui lòng xem câu trả lời @fanisch.
Beyers

4
Làm thế nào về Deserialization? Tôi đã gặp lỗi này tại ràng buộc mô hình của hành động.
guogangj

345

Trong MVC 4 bạn có thể làm:

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult()
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior,
        MaxJsonLength = Int32.MaxValue
    };
}

trong bộ điều khiển của bạn.

Thêm vào:

Đối với bất kỳ ai bối rối trước các tham số bạn cần chỉ định, một cuộc gọi có thể giống như thế này:

Json(
    new {
        field1 = true,
        field2 = "value"
        },
    "application/json",
    Encoding.UTF8,
    JsonRequestBehavior.AllowGet
);

6
Tôi có thể xác nhận rằng những điều trên hoạt động như một nét quyến rũ trong MVC 4, cảm ơn bạn fanisch.
Beyers

9
Tôi có thể xác nhận là tốt. Đặt mã này trong bộ điều khiển cơ sở chắc chắn là cách tiếp cận sạch nhất được đề xuất.
Quốc hội

15
Điều này cũng hoạt động bằng cách chỉ thêm "MaxJsonLpm = Int32.MaxValue" vào kết quả hành động riêng lẻ. Trong trường hợp thay đổi không mong muốn bộ điều khiển hoặc dự án rộng.
Hypnovirus

3
Đây là câu trả lời tốt nhất. MaxJsonLpm có thể được cấu hình trên mỗi bộ điều khiển.
liang

3
CẢNH BÁO: giải pháp này vô hiệu hóa nén (nếu được yêu cầu) của phản hồi. Thêm bộ lọc này vào hành động của bạn: stackoverflow.com/questions/3802107/ từ
Gorgi Rankovski

60

Bạn có thể định cấu hình độ dài tối đa cho các yêu cầu json trong tệp web.config:

<configuration>
    <system.web.extensions>
        <scripting>
            <webServices>
                <jsonSerialization maxJsonLength="....">
                </jsonSerialization>
            </webServices>
        </scripting>
    </system.web.extensions>
</configuration>

Giá trị mặc định cho maxJsonLpm là 102400 . Để biết thêm chi tiết, xem trang MSDN này: http://msdn.microsoft.com/en-us/l Library / bb763183.aspx


1
Giá trị được lưu trữ trong số nguyên này đại diện là gì? Đây có phải là một số loại tính cách? Tôi đoán những gì tôi đang hỏi là, tại sao một số nguyên đang được sử dụng? Cảm ơn!
Eaglei22

@ Eaglei22 con số biểu thị số lượng byte có thể được sử dụng cho maxJsonLpm. Như M4N đã đề cập, 102400 là mặc định (100KB).
Jacob Plonke

điều này không hiệu quả với tôi và tôi không sử dụng dịch vụ web.
kalai

42

nếu bạn vẫn gặp lỗi sau khi cài đặt web.config như sau:

<configuration> 
   <system.web.extensions>
       <scripting>
           <webServices>
               <jsonSerialization maxJsonLength="50000000"/>
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration> 

Tôi đã giải quyết nó bằng cách sau:

   public ActionResult/JsonResult getData()
   {
      var jsonResult = Json(superlargedata, JsonRequestBehavior.AllowGet);
      jsonResult.MaxJsonLength = int.MaxValue;
      return jsonResult;
    }

Tôi hy vọng điều này sẽ giúp.


2
Đặt maxJsonLpm trong web.config là không rõ ràng, cài đặt jsonResult.MaxJsonLpm sẽ đủ (ít nhất là với tôi (MVC5))
hormoneberg

Điều này là tốt bởi vì nó không phải là một sự thay đổi toàn cầu.
rob_james

40

Tôi đã gặp vấn đề này trong ASP.NET Web Forms. Nó đã hoàn toàn bỏ qua các cài đặt tệp web.config vì vậy tôi đã làm điều này:

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

Tất nhiên nói chung đây là thực hành khủng khiếp. Nếu bạn đang gửi nhiều dữ liệu này trong một cuộc gọi dịch vụ web, bạn nên xem xét một cách tiếp cận khác.


1
đã làm việc này cho bạn? bạn đã đặt mã này ở đâu?
1012598

Vấn đề của chúng tôi là vì chúng tôi có một textarea cho phép HTML và mọi người đã nhúng hình ảnh dưới dạng HTML khiến mục nhập trở nên rất lớn và trình tuần tự JSON bị lỗi. Tôi đoán nếu nó có thể được thực hiện, người dùng sẽ làm điều đó ...
Marko

Vui lòng mô tả nơi chúng tôi nên đặt mã này ... @Flea
Koray Durudogan

@KorayDurudogan - Tôi đặt phương thức này trong phương thức Ajax đang trả về phản hồi, vì vậy trong bộ điều khiển của tôi. Mong rằng sẽ giúp!
Bọ chét

Tôi không thách thức phản ứng của bạn, nhưng cố gắng hiểu rõ hơn về những cách tiếp cận tốt hơn. Tôi có một truy vấn tùy thuộc vào tiêu chí của người dùng sẽ xác định kích thước kết quả. Tôi trả lại một JsonResult, sẽ có vấn đề gì nếu tôi trả lại một tệp excel?
Eaglei22

22

Tôi sửa nó rồi.

//your Json data here
string json_object="........";
JavaScriptSerializer jsJson = new JavaScriptSerializer();
jsJson.MaxJsonLength = 2147483644;
MyClass obj = jsJson.Deserialize<MyClass>(json_object);

Nó hoạt động rất tốt.


Tuyệt vời! Đây là giải pháp duy nhất hiệu quả với tôi và dù sao nó cũng tốt hơn vì nó không phải là một thay đổi toàn cầu. Cảm ơn!
Sealer_05

20

Tôi đã làm theo câu trả lời của vestigal và nhận được giải pháp này:

Khi tôi cần đăng một json lớn lên một hành động trong bộ điều khiển, tôi sẽ nhận được "Lỗi trong quá trình khử lưu trữ bằng cách sử dụng JSON JavaScriptSerializer. Độ dài của chuỗi vượt quá giá trị được đặt trên thuộc tính maxJsonLpm. \ R \ nParameter name: input nhà cung cấp giá trị ".

Những gì tôi đã làm là tạo ra một ValueProviderFactory, LargeJsonValueProviderFactory và đặt MaxJsonLạng = Int32.MaxValue trong phương thức GetDeserializedObject

public sealed class LargeJsonValueProviderFactory : ValueProviderFactory
{
private static void AddToBackingStore(LargeJsonValueProviderFactory.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)
            LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);
    }
    else
    {
        IList list = value as IList;
        if (list != null)
        {
            for (int index = 0; index < list.Count; ++index)
                LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.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);
}

/// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
/// <returns>A JSON value-provider object for the specified controller context.</returns>
/// <param name="controllerContext">The controller context.</param>
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
    if (controllerContext == null)
        throw new ArgumentNullException("controllerContext");
    object deserializedObject = LargeJsonValueProviderFactory.GetDeserializedObject(controllerContext);
    if (deserializedObject == null)
        return (IValueProvider) null;
    Dictionary<string, object> dictionary = new Dictionary<string, object>((IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase);
    LargeJsonValueProviderFactory.AddToBackingStore(new LargeJsonValueProviderFactory.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 = LargeJsonValueProviderFactory.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 > LargeJsonValueProviderFactory.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;
     }
  }
}

Sau đó, trong phương thức Application_Start từ Global.asax.cs, thay thế ValueProviderFactory bằng phương thức mới:

protected void Application_Start()
{
    ...

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

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

    var largeJsonValueProviderFactory = new LargeJsonValueProviderFactory();
    ValueProviderFactories.Factories.Add(largeJsonValueProviderFactory);
}

1
Tôi đã làm mọi thứ tôi có thể, chỉ có câu trả lời của bạn đã cứu tôi, câu trả lời này đáng lẽ phải được chấp nhận
Muhammad Waqas Aziz

Với mã này, chúng tôi có thể ghi đè lên bộ điều khiển MVC max json Giới hạn Deserializetion là 4 mb, nhưng có cách nào để ghi đè lên bộ điều khiển web-api max json Giới hạn Deserializetion
Muhammad Waqas Aziz

17

nếu, sau khi thực hiện bổ sung trên vào web.config, bạn sẽ nhận được phần cấu hình không nhận dạng của hệ thống system.web.extensions. sau đó thử thêm phần này vào web.config trong <ConfigSections>phần:

            <sectionGroup name="system.web.extensions" type="System.Web.Extensions">
              <sectionGroup name="scripting" type="System.Web.Extensions">
                    <sectionGroup name="webServices" type="System.Web.Extensions">
                          <section name="jsonSerialization" type="System.Web.Extensions"/>
                    </sectionGroup>
              </sectionGroup>
        </sectionGroup>

4
Tôi đã có vấn đề này. Tuy nhiên, câu trả lời này không làm việc cho tôi. Thay vì thêm phần tử <partgroup> được mô tả ở đây, tôi chỉ di chuyển toàn bộ khối <system.web.extensions> mới được thêm vào cuối web.config ... ngay trước </ configure>. Sau đó, nó làm việc.
ClearCloud8

Điều này có ích, nhưng trong tình huống của tôi, tôi cần thay đổi dòng thứ tư của bạn thành <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>, như đã thấy trên trang này: forum.asp.net/t/1446510.aspx/1
Nathan

@ ClearCloud8 Nhận bình luận đó lan truyền trên trang này ngay lập tức.
Jack Nutkins

11

bạn có thể viết dòng này vào Bộ điều khiển

json.MaxJsonLength = 2147483644;

bạn cũng có thể viết dòng này vào web.config

<configuration>
  <system.web.extensions>
    <scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>
  </system.web.extensions>

`

Để được an toàn, sử dụng cả hai.


10

Nếu bạn gặp lỗi này từ MiniProfiler trong MVC thì bạn có thể tăng giá trị bằng cách đặt thuộc tính MiniProfiler.Settings.MaxJsonResponseSizethành giá trị mong muốn. Theo mặc định, công cụ này dường như bỏ qua giá trị được đặt trong cấu hình.

MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

Lịch sự mvc-mini-profiler .


10

Đơn giản chỉ cần đặt proprty MaxJsonLpm trong phương thức Action của MVC

JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet);
json.MaxJsonLength = int.MaxValue;
return json;

9

Tôi đề nghị đặt nó thành Int32.MaxValue.

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;

9

Làm thế nào về một số thuộc tính ma thuật?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class MaxJsonSizeAttribute : ActionFilterAttribute
{
    // Default: 10 MB worth of one byte chars
    private int maxLength = 10 * 1024 * 1024;

    public int MaxLength
    {
        set
        {
            if (value < 0) throw new ArgumentOutOfRangeException("value", "Value must be at least 0.");

            maxLength = value;
        }
        get { return maxLength; }
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        JsonResult json = filterContext.Result as JsonResult;
        if (json != null)
        {
            if (maxLength == 0)
            {
                json.MaxJsonLength = int.MaxValue;
            }
            else
            {
                json.MaxJsonLength = maxLength;
            }
        }
    }
}

Sau đó, bạn có thể áp dụng nó trên toàn cầu bằng cách sử dụng cấu hình bộ lọc toàn cầu hoặc bộ điều khiển / hành động khôn ngoan.


Câu trả lời chính xác. Sử dụng tốt các thuộc tính tùy chỉnh. Tự hỏi liệu có một lý do cụ thể (kỹ thuật) nào mà bạn đặt mặc định thành 10 MB ký tự một byte thay vì Max (int.MaxValue) không?
Josh

@Josh Không, không có lý do đặc biệt cho điều đó.
Balázs

5

Câu hỏi thực sự là liệu bạn có thực sự cần trả lại hồ sơ 17k không? Làm thế nào bạn có kế hoạch để xử lý tất cả các dữ liệu trong trình duyệt? Người dùng sẽ không cuộn qua 17000 hàng nào.

Cách tiếp cận tốt hơn là chỉ truy xuất một bản ghi "vài đầu" và tải thêm theo yêu cầu.


1
Danh sách mặc định từ json sẽ cung cấp 17k hồ sơ. Nhưng tính năng tự động hoàn thành sẽ chỉ liệt kê các bản ghi khớp với các ký tự mà người dùng nhập, do đó nó không cần phải cuộn danh sách nhiều hơn. Vì vậy, những gì tôi cần là đặt chiều dài không giới hạn cho maxJsonLpm có thể tuần tự hóa dữ liệu 17k.
Prasad

6
Bạn có thể sử dụng kết hợp bộ lọc phía máy chủ và máy khách. Có thể khó lọc tất cả dữ liệu về phía máy khách, chưa kể đến độ trễ của mạng.
Chetan Sastry

1
Đã gặp vấn đề tương tự một thời gian trước, tôi đã chọn triển khai trình xử lý "onsearch" cho tự động hoàn thành và yêu cầu dịch vụ web chuyển văn bản "tìm kiếm" và thực hiện truy vấn Top10 bằng tiêu chí tìm kiếm làm bộ lọc. Điều này có nghĩa là nhiều yêu cầu ajax riêng lẻ hơn, chỉ nhận được danh sách đầy đủ khi tải trang, nhưng nó cũng có nghĩa là tất cả các yêu cầu / phản hồi nhỏ hơn nhiều .
Mike U

3

Bạn có thể đặt nó trong cấu hình như những người khác đã nói hoặc bạn có thể đặt trong một phiên bản riêng lẻ của trình tuần tự hóa như:

var js = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue };

3

Đối với những người đang gặp vấn đề với MVC3 với JSON, nó sẽ tự động được giải tuần tự hóa cho một chất kết dính mô hình và quá lớn, đây là một giải pháp.

  1. Sao chép mã cho lớp JsonValueProviderFactory từ mã nguồn MVC3 sang một lớp mới.
  2. Thêm một dòng để thay đổi độ dài JSON tối đa trước khi đối tượng được khử lưu huỳnh.
  3. Thay thế lớp JsonValueProviderFactory bằng lớp mới, đã sửa đổi của bạn.

Cảm ơn http://blog.naver.com/techshare/100145191355https://gist.github.com/DalSoft/1588818 đã chỉ cho tôi đi đúng hướng để làm điều này. Liên kết cuối cùng trên trang web đầu tiên chứa mã nguồn đầy đủ cho giải pháp.


3

Nếu bạn gặp phải loại vấn đề này trong Chế độ xem, bạn có thể sử dụng phương pháp bên dưới để giải quyết vấn đề đó. Ở đây tôi đã sử dụng gói Newtonsoft .

@using Newtonsoft.Json
<script type="text/javascript">
    var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part));
</script>

Điều này có nghĩa là tôi không phải lo lắng về độ dài tối đa nếu tôi sử dụng Json.NET? Tôi không nghĩ có một cách để thiết lập độ dài tối đa trong Json.NET vì vậy tôi hy vọng nó chỉ hoạt động tốt.
kimbaudi

1
Câu trả lời tuyệt vời cảm ơn bạn! Điều này cũng hoạt động khi tôi đang cố gắng tải một đối tượng.
dùng1299379

3
 JsonResult result = Json(r);
 result.MaxJsonLength = Int32.MaxValue;
 result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 return result;

2

Dường như không có giá trị "không giới hạn". Mặc định là 2097152 ký tự, tương đương với 4 MB dữ liệu chuỗi Unicode.

Như đã được quan sát, 17.000 hồ sơ khó sử dụng tốt trong trình duyệt. Nếu bạn đang trình bày một chế độ xem tổng hợp, có thể hiệu quả hơn nhiều khi thực hiện tổng hợp trên máy chủ và chỉ chuyển một bản tóm tắt trong trình duyệt. Ví dụ, hãy xem xét một trình duyệt hệ thống tệp, chúng ta chỉ thấy phần trên của cây, sau đó phát ra các yêu cầu tiếp theo khi chúng ta đi sâu vào. Số lượng hồ sơ được trả lại trong mỗi yêu cầu là tương đối nhỏ. Một bản trình bày xem cây có thể hoạt động tốt cho các tập kết quả lớn.


3
khá kỳ lạ là mã mặc định (JavaScriptSerializer ()) mới. MaxJsonLpm là 2097152 byte nhưng dịch vụ web FeedbackFormatJson là 102400 byte trừ khi được đặt rõ ràng.
cướp

2

Chỉ cần chạy vào đây. Tôi đang nhận được hơn 6.000 hồ sơ. Chỉ cần quyết định tôi sẽ làm một số phân trang. Như trong, tôi chấp nhận một số trang trong điểm cuối MVC JsonResult của tôi, được mặc định là 0 nên không cần thiết, như vậy:

public JsonResult MyObjects(int pageNumber = 0)

Sau đó, thay vì nói:

return Json(_repository.MyObjects.ToList(), JsonRequestBehavior.AllowGet);

Tôi nói:

return Json(_repository.MyObjects.OrderBy(obj => obj.ID).Skip(1000 * pageNumber).Take(1000).ToList(), JsonRequestBehavior.AllowGet);

Nó rất đơn giản. Sau đó, trong JavaScript, thay vì điều này:

function myAJAXCallback(items) {
    // Do stuff here
}

Tôi thay vào đó nói:

var pageNumber = 0;
function myAJAXCallback(items) {
    if(items.length == 1000)
        // Call same endpoint but add this to the end: '?pageNumber=' + ++pageNumber
    }
    // Do stuff here
}

Và nối hồ sơ của bạn vào bất cứ điều gì bạn đang làm với họ ở nơi đầu tiên. Hoặc chỉ cần đợi cho đến khi tất cả các cuộc gọi kết thúc và kết hợp các kết quả lại với nhau.


2

Tôi đã giải quyết vấn đề thêm mã này:

String confString = HttpContext.Current.Request.ApplicationPath.ToString();
Configuration conf = WebConfigurationManager.OpenWebConfiguration(confString);
ScriptingJsonSerializationSection section = (ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization");
section.MaxJsonLength = 6553600;
conf.Save();

Đây có vẻ như là một giải pháp hackish nhưng cách tiếp cận thú vị bất kể. Tôi thấy nó hữu ích cảm ơn! Đối với tôi trong bộ điều khiển apsnet mvc 5 tôi phải xóa 'Hiện tại' khỏi không gian tên. Tôi đã thực hiện một vài điều chỉnh:string confString = HttpContext.Request.ApplicationPath.ToString(); var conf = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(confString); var section = (System.Web.Configuration.ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization"); section.MaxJsonLength = int.MaxValue; conf.Save();
ooXei1sh

2

Thay thế ASP.NET MVC 5:

(Của tôi tương tự như câu trả lời của MFC ở trên với một vài thay đổi nhỏ)

Tôi chưa sẵn sàng để thay đổi thành Json.NET và trong trường hợp của tôi, lỗi đã xảy ra trong khi yêu cầu. Cách tiếp cận tốt nhất trong kịch bản của tôi là sửa đổi thực tế JsonValueProviderFactoryáp dụng sửa lỗi cho dự án toàn cầu và có thể được thực hiện bằng cách chỉnh sửa global.cstệp như vậy.

JsonValueProviderConfig.Config(ValueProviderFactories.Factories);

thêm một mục web.config:

<add key="aspnet:MaxJsonLength" value="20971520" />

và sau đó tạo hai lớp sau

public class JsonValueProviderConfig
{
    public static void Config(ValueProviderFactoryCollection factories)
    {
        var jsonProviderFactory = factories.OfType<JsonValueProviderFactory>().Single();
        factories.Remove(jsonProviderFactory);
        factories.Add(new CustomJsonValueProviderFactory());
    }
}

Về cơ bản, đây là một bản sao chính xác của cài đặt mặc định được tìm thấy System.Web.Mvcnhưng có thêm giá trị ứng dụng web.config có thể định cấu hình aspnet:MaxJsonLength.

public class CustomJsonValueProviderFactory : ValueProviderFactory
{

    /// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
    /// <returns>A JSON value-provider object for the specified controller context.</returns>
    /// <param name="controllerContext">The controller context.</param>
    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        if (controllerContext == null)
            throw new ArgumentNullException("controllerContext");

        object deserializedObject = CustomJsonValueProviderFactory.GetDeserializedObject(controllerContext);
        if (deserializedObject == null)
            return null;

        Dictionary<string, object> strs = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
        CustomJsonValueProviderFactory.AddToBackingStore(new CustomJsonValueProviderFactory.EntryLimitedDictionary(strs), string.Empty, deserializedObject);

        return new DictionaryValueProvider<object>(strs, CultureInfo.CurrentCulture);
    }

    private static object GetDeserializedObject(ControllerContext controllerContext)
    {
        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            return null;

        string fullStreamString = (new StreamReader(controllerContext.HttpContext.Request.InputStream)).ReadToEnd();
        if (string.IsNullOrEmpty(fullStreamString))
            return null;

        var serializer = new JavaScriptSerializer()
        {
            MaxJsonLength = CustomJsonValueProviderFactory.GetMaxJsonLength()
        };
        return serializer.DeserializeObject(fullStreamString);
    }

    private static void AddToBackingStore(EntryLimitedDictionary backingStore, string prefix, object value)
    {
        IDictionary<string, object> strs = value as IDictionary<string, object>;
        if (strs != null)
        {
            foreach (KeyValuePair<string, object> keyValuePair in strs)
                CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);

            return;
        }

        IList lists = value as IList;
        if (lists == null)
        {
            backingStore.Add(prefix, value);
            return;
        }

        for (int i = 0; i < lists.Count; i++)
        {
            CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakeArrayKey(prefix, i), lists[i]);
        }
    }

    private class EntryLimitedDictionary
    {
        private static int _maximumDepth;

        private readonly IDictionary<string, object> _innerDictionary;

        private int _itemCount;

        static EntryLimitedDictionary()
        {
            _maximumDepth = CustomJsonValueProviderFactory.GetMaximumDepth();
        }

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

        public void Add(string key, object value)
        {
            int num = this._itemCount + 1;
            this._itemCount = num;
            if (num > _maximumDepth)
            {
                throw new InvalidOperationException("The length of the string exceeds the value set on the maxJsonLength property.");
            }
            this._innerDictionary.Add(key, value);
        }
    }

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

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

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

    private static int GetMaxJsonLength()
    {
        int num;
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonLength");
            if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
            {
                return num;
            }
        }
        return 1000;
    }
}

1
Cảm ơn nó đã hoạt động ... Cảm ơn rất nhiều @Maxim Gershkovich
Jasper Manickaraj

0

sử dụng lib\Newtonsoft.Json.dll

public string serializeObj(dynamic json) {        
    return JsonConvert.SerializeObject(json);
}

0

Giải pháp cho WebForms UpdatePanel:

Thêm cài đặt vào Web.config:

<configuration>
  <appSettings>
    <add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
  </appSettings>
</configuration>

https://support.microsoft.com/en-us/kb/981884

ScriptRegistrationManager lớp chứa mã sau đây:

// Serialize the attributes to JSON and write them out
JavaScriptSerializer serializer = new JavaScriptSerializer();

// Dev10# 877767 - Allow configurable UpdatePanel script block length
// The default is JavaScriptSerializer.DefaultMaxJsonLength
if (AppSettings.UpdatePanelMaxScriptLength > 0) {
    serializer.MaxJsonLength = AppSettings.UpdatePanelMaxScriptLength;
}  

string attrText = serializer.Serialize(attrs);

0

Chúng tôi không cần bất kỳ thay đổi phía máy chủ. bạn chỉ có thể sửa lỗi này bằng tệp web.config Điều này giúp tôi. thử thứ này đi

<appSettings>
 <add key="aspnet:MaxJsonDeserializerMembers" value="2147483647" />
<add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
</appSettings>  

and   

<system.web.extensions>
<scripting>
  <webServices>
    <jsonSerialization maxJsonLength="2147483647"/>
  </webServices>
</scripting>


0

Khắc phục cho ASP.NET MVC: nếu bạn chỉ muốn sửa nó cho hành động cụ thể gây ra sự cố thì hãy mã như thế này:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return Json(someBigObject);
}

bạn có thể thay đổi điều này:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return new JsonResult()
    {
        Data = someBigObject,
        JsonRequestBehavior = JsonRequestBehavior.DenyGet,
        MaxJsonLength = int.MaxValue
    };
}

Và chức năng phải giống nhau, bạn chỉ có thể trả về JSON lớn hơn dưới dạng phản hồi.


Giải thích dựa trên mã nguồn ASP.NET MVC: bạn có thể kiểm tra Controller.Jsonphương thức nào trong mã nguồn ASP.NET MVC

protected internal JsonResult Json(object data)
{
    return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}

Nó đang gọi Controller.Jsonphương thức khác :

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };
}

nơi thông qua contentTypecontentEncodingđối tượng là null. Vì vậy, về cơ bản gọi return Json(object)trong bộ điều khiển là tương đương với gọi return new JsonResult { Data = object, JsonRequestBehavior = sonRequestBehavior.DenyGet }. Bạn có thể sử dụng mẫu thứ hai và tham số hóa JsonResult.

Vậy điều gì xảy ra khi bạn đặt thuộc MaxJsonLengthtính (theo mặc định là null)? Nó được truyền lại cho JavaScriptSerializer.MaxJsonLengthtài sản và sau đó JavaScriptSerializer.Serializephương thức được gọi là :

JavaScriptSerializer serializer = new JavaScriptSerializer();
if (MaxJsonLength.HasValue)
{
    serializer.MaxJsonLength = MaxJsonLength.Value;
}

if (RecursionLimit.HasValue)
{
    serializer.RecursionLimit = RecursionLimit.Value;
}

response.Write(serializer.Serialize(Data));

Và khi bạn không đặt MaxJsonLenghtthuộc tính của serializer thì nó sẽ lấy giá trị mặc định chỉ là 2MB.


-2

Nếu giá trị maxJsonLpm này là int thì int 32bit / 64bit / 16bit của nó lớn đến mức nào. Tôi chỉ muốn chắc chắn giá trị tối đa tôi có thể đặt là maxJsonLpm của mình

<scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>

-4

Bạn không cần phải làm với web.config Bạn có thể sử dụng thuộc tính ngắn trong giá trị bắt của danh sách chuyển qua Ví dụ: khai báo một mô hình như

public class BookModel
    {
        public decimal id { get; set; }  // 1 

        public string BN { get; set; } // 2 Book Name

        public string BC { get; set; } // 3 Bar Code Number

        public string BE { get; set; } // 4 Edition Name

        public string BAL { get; set; } // 5 Academic Level

        public string BCAT { get; set; } // 6 Category
}

Ở đây tôi sử dụng các tỷ lệ ngắn như BC = mã vạch BE = phiên bản sách, v.v.


Điều này sẽ không hữu ích nếu phần lớn dữ liệu nằm trong các giá trị thuộc tính
Cửa sổ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.