1. 발생현상
C# ASP.NET 4.6.1버전으로 웹페이지를 개발하던 중, View에서 요청한 데이터를 Controller에서 리턴해주는 과정에서 다음과 같은 오류가 발생했다.
이는 기본 Json 응답 크기 제한(ASP.NET 4.6.1버전 기준 - 4MB)을 넘어선 데이터를 응답하려 해서 발생한 에러이다.
이를 해결하기 위한 여러 방안은 다음과 같다.
- maximum JSON response size를 증가시킨다
- Controller에서 더 큰 JSON응답을 반환할 수 있도록 설정을 수정해주는 방법이다. - 페이지 매김 또는 데이터 필터링을 구현한다.
- 큰 크기의 데이터를 요청하는 대신 특정 부분을 조회할 수 있게 해주어, 응답하는 데이터의 크기를 간소화하는 방법이다. - 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에서 데이터를 받아 사용자들에게 보여질 수 있게 해결되었다.
'Record > Trubble Shooting' 카테고리의 다른 글
[Python] pip 명령어 문제 해결: Fatal error in launcher: Unable to create process using '"' (1) | 2023.10.07 |
---|---|
[Postgresql14] postgres service가 에러로인해 시작되지 않던 문제 해결 (0) | 2023.02.01 |
[NPM] 사용했던 Package가 업데이트되면서 발생되던 버그 해결 (0) | 2022.12.08 |
API 서버에 설치한 postgresql 서비스가 간헐적으로 죽는 문제 해결 (0) | 2022.08.20 |