Record/Trubble Shooting

C# ASP.NET에서 JavaScriptSerializer maxJsonLength 초과 에러 발생 해결

범데이 2023. 6. 26. 23:21

1. 발생현상

C# ASP.NET 4.6.1버전으로 웹페이지를 개발하던 중, View에서 요청한 데이터를 Controller에서 리턴해주는 과정에서 다음과 같은 오류가 발생했다.

 

 

 

 

 

 

이는 기본 Json 응답 크기 제한(ASP.NET 4.6.1버전 기준 - 4MB)을 넘어선 데이터를 응답하려 해서 발생한 에러이다.

 

이를 해결하기 위한 여러 방안은 다음과 같다.

  1. maximum JSON response size를 증가시킨다
    - Controller에서 더 큰 JSON응답을 반환할 수 있도록 설정을 수정해주는 방법이다.
  2. 페이지 매김 또는 데이터 필터링을 구현한다.
    - 큰 크기의 데이터를 요청하는 대신 특정 부분을 조회할 수 있게 해주어, 응답하는 데이터의 크기를 간소화하는 방법이다.
  3. JSON 응답 데이터를 압축시킨다.
    - 이는 Controller에서 View로 데이터를 리턴하기 전에 데이터를 압축해서 보내주는 방식이다. 압축은 GZip압축을 사용하거나 IIS에서 동적 압축을 활성하 하는 등 다양한 방법이 있다고 한다.


2. 1차 해결방안

본인은 요청한 데이터를 온전히 응답해주어야 하는 상황인지라, 위의 해결방안 중 1번을 채택하여 응답 크기 제한을 10MB로 높이려고 하였다.

 

구글링을 통해 알아낸 방법으로 Web.config파일의 maxJsonLength값을 다음과 같이 수정해주었다.

<configuration>
	...
	<system.web>
		<httpRuntime maxJsonLength="10485760" />
	</system.web>
	...
</configuration>

하지만, maxJsonLength라는 속성이 없다고 빌드 에러가 발생하였다.

그래서 다른 방법을 찾아보았다.

 

 

3. 2차 해결방안

httpRuntime요소의 “maxJsonLength” 속성은 현재 사용중인 ASP.NET 버전보다 후에 생긴 속성으로, 사용할 수 없다고 한다. 현재로써는 속성에 직접적으로 maxJsonLength를 설정하는 방법은 없다고 한다.

 

그래서 아래와 같이 custom serializer를 사용하여 프로그래밍 방식으로 응답하는 과정에서 설정해주어 리턴하는 방식을 선택하였다.

using System.Web.Mvc;
using System.Web.Script.Serialization;

public class YourController : Controller
{
    public ActionResult YourAction()
    {
        // Get your data to serialize
        var data = GetYourData();

        // Serialize the data using a custom serializer
        var serializer = new JavaScriptSerializer();
        serializer.MaxJsonLength = int.MaxValue; // Set the maximum JSON response size

        // Serialize the data to JSON
        var json = serializer.Serialize(data);

        // Return the JSON result
        return Content(json, "application/json");
    }
}

위 방식으로 JavaScriptSerializer클래스를 사용하여 JSON응답 크기(int.MaxValue)에 대한 제한 없이 수동으로 데이터를 직렬화한다.

 

그러나 이 접근 방식은 특히 대규모 데이터 세트의 경우 성능 및 메모리 사용량에 영향을 미칠 수 있으니 주의해야 한다.

 

 

따라서 사용중인 코드를 다음과 같이 수정하였다.

 

[이전]

...
using System.Web.Mvc;

public async Task<JsonResult> FetchData(){
	...
	
	return Json(model, JsonREquestBehavior.AllowGet);
}

 

[이후]

...
using System.Web.Mvc;
using System.Web.Script.Serialization;

public async Task<ContentResult> FetchData(){
	...

	var serializer = new JavaScriptSerializer();
	serializer.MaxJsonLength = int.MaxValue;

	var json = serializer.Serialize(model);
	return Content(json, "application/json");
}

이렇게 수정해주니, 4MB가 훌쩍 넘는 방대한 데이터도 리턴이 되어,

View에서 데이터를 받아 사용자들에게 보여질 수 있게 해결되었다.

반응형