|
Programmer ASP.NET MVC C# |
Programming
|
|||
Предыдущий | Следующий | ||
С появлением jquery стало очень удобно с работать Ajax. И теперь при работе с Grid я обращаюсь к методам контролера, которые возвращает информацию в Json формате. Не знаю правильно ли это, но очень удобно. Но в таком подходе есть свои проблемы. По умолчанию количество символов передаваемых таким методом ограничено. И сервер выдает ошибку: Server Error in ‘/’ Application.
|
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. |
Stack Trace:
|
Поискал в интернете, и нашел решение проблемы.
Ошибка находится внутри обращения MVC к BCL.
if (Data != null) {
JavaScriptSerializer serializer = new JavaScriptSerializer();
response.Write(serializer.Serialize(Data));
}
Во время сериализации сервер падает.
public string Serialize(object obj) {
return Serialize(obj, SerializationFormat.JSON);
}
private string Serialize(object obj, SerializationFormat serializationFormat) {
StringBuilder sb = new StringBuilder();
Serialize(obj, sb, serializationFormat);
return sb.ToString();
}
internal void Serialize(object obj, StringBuilder output, SerializationFormat serializationFormat) {
SerializeValue(obj, output, 0, null, serializationFormat);
// DevDiv Bugs 96574: Max JSON length does not apply when serializing to Javascript for ScriptDescriptors
if (serializationFormat == SerializationFormat.JSON && output.Length > MaxJsonLength) {
throw new InvalidOperationException(AtlasWeb.JSON_MaxJsonLengthExceeded);
}
}
Т.е. стоит ограничение в 96574 символов. Мы должны реализовать наш собственный ActionResult, который будет генерировать JSON любого размера. Код:
using System;
using System.Web.Script.Serialization;
namespace System.Web.Mvc
{
public class LargeJsonResult : JsonResult
{
const string JsonRequest_GetNotAllowed = "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( JsonRequest_GetNotAllowed );
}
HttpResponseBase response = context.HttpContext.Response;
if( !String.IsNullOrEmpty( ContentType ) )
{
response.ContentType = ContentType;
}
else
{
response.ContentType = "application/json";
}
if( ContentEncoding != null )
{
response.ContentEncoding = ContentEncoding;
}
if( Data != null )
{
JavaScriptSerializer serializer = new JavaScriptSerializer() { MaxJsonLength = MaxJsonLength, RecursionLimit = RecursionLimit };
response.Write( serializer.Serialize( Data ) );
}
}
}
}
Теперь мы можем использовать этот класс:
return new LargeJsonResult() { Data = output, MaxJsonLength = int.MaxValue };
Так же нужно подправить web.config
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644" />
</webServices>
</scripting>
</system.web.extensions>
В 2/11/2013 6:04:36 PM, Аноним
Божественно!