Thursday, November 15, 2012

ASP.NET MVC: The length of the string exceeds the value set on the maxJsonLength property.

Last week one of our users reported a bug that they got an exception back when loading a big set of data. When looking at the exception logs, we saw that the following InvalidOperation exception was thrown:

Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.

Some people suggested to set the maxJsonLength property in the web.config to a higher value, but this value is not used by ASP.NET MVC

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


We solved the issue by creating our own Actionresult inheriting from the existing JsonResult class based on the information in this post:



public class LargeJsonResult:JsonResult
{
const string JsonRequestGetNotAllowed = "This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.";

public LargeJsonResult()
{
MaxJsonLength = 1024000;
RecursionLimit = 100;
}

public int MaxJsonLength { get; set; }
public int RecursionLimit { get; set; }

public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");

if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException(JsonRequestGetNotAllowed);

var response = context.HttpContext.Response;
response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";

if (ContentEncoding != null)
response.ContentEncoding = ContentEncoding;

if (Data != null)
{
var serializer = new JavaScriptSerializer { MaxJsonLength = MaxJsonLength, RecursionLimit = RecursionLimit };
response.Write(serializer.Serialize(Data));
}
}
}

No comments: