2014-12-12 7 views
3

커다란 응답의 컨텍스트에서이 문제를 해결하는 몇 가지 답변을 찾았지만 대용량 요청에 대한 내 컨텍스트에는 맞지 않습니다.JavaScriptSerializer에서 maxJsonLength를 초과하여 예외를 해결하려면 어떻게해야합니까?

오류를 직렬화 또는 직렬화 복원 중에 JSON JavaScriptSerializer를 사용 : 작업 방법에 큰 파일을 게시 할 때 나는 다음과 같은 예외를 얻을. 문자열의 길이가 maxJsonLength 등록 정보에 설정된 값을 초과합니다.

내 행동 방법이 충돌하기 전에 이것은 내 응답에 더 높은 json 크기를 설정하라는 내용의 게시물이 모두 쓸모가 없다는 것을 의미합니다.

스택 추적 :

at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) 
at System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input) 
at System.Web.Mvc.JsonValueProviderFactory.GetDeserializedObject(ControllerContext controllerContext) 
at System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext) 
at System.Web.Mvc.ValueProviderFactoryCollection.<>c__DisplayClassc.<GetValueProvider>b__7(ValueProviderFactory factory) 
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
at System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext) 
at System.Web.Mvc.ControllerBase.get_ValueProvider() 
at System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) 
at System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) 
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) 
at System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) 
at System.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) 
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) 
at System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) 
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) 
at System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) 
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) 
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
+0

이 경우 스택 추적은 무엇일까요? –

+0

@RobertLevy 후손을 위해 추가되었지만 해결책을 찾았습니다. – ProfK

답변

5

는 광범위하고 공포에 시달리는 인터넷 검색이 문제를 다른 한 가난한 dev에 굴복, 대답은 간단하지만 실망 침략 :

First you must build a custom JsonValueProviderFactory.

나는 그대로 그의 대답에서 dkinchen의 사용자 지정 코드를 복사하고 난 즉시 일했다.

나는 이것이 링크 대답이라는 것을 알고 있지만, 링크의 텍스트 자체는 꽤 좋은 대답이라고 생각합니다.

1

세 가지 기본이 현재의 환경에 따라 처리 방법이 있습니다 : 당신의 Web.config 내에서 MaxJsonLength 속성 기본 값을 설정

  1. 가. JSON을 처리하는 웹 서비스에만 적용됩니다.
  2. JavascriptSerializer 개체의 MaxJsonLength 속성을 직렬화를 수행하도록 설정합니다.
  3. JSON 값을 처리하는 데 MVC4을 사용하는 경우 기본값 JsonResult()ActionResult을 무시하고 최대 크기를 수동으로 변경할 수 있습니다. 이 세 가지 솔루션을 구현하는 방법에 대한

소스 & 더 많은 정보는 : http://rionscode.wordpress.com/2013/04/28/handling-larger-json-string-values-in-net-and-avoiding-exceptions/

+1

추가 후 차이가 없습니다. – ProfK

+0

업데이트 된 응답을 확인하십시오. –

+0

나는 어떤 값을 반환하거나 어떤 직렬화도하지 않을 것이다. 액션 코드가 적용되기 전에도 액션에 게시하면 오류가 발생합니다. – ProfK

0

Web.config 또는 Controller에서 키를 지정하거나이 두 가지 모두에서 키를 지정하여이 문제를 해결할 수 있습니다.

1)의 Web.config, 방법 1 :

<add key="aspnet:MaxJsonDeserializerMembers" value="214748364" />

2)의 Web.config, 방법 -2 :

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

3 여기서 방법은 .) 컨트롤러에서 JSON 데이터를 반환하는 중 :

var result = Json("Data", JsonRequestBehavior.AllowGet); 
      result.MaxJsonLength = Int32.MaxValue; 
      return result; 
+1

'system.web.extensions'는 웹 서비스에만 해당되며 컨트롤러 작업에는 적용되지 않습니다. – ProfK

+0

그것은 무엇입니까? 모든 JavaScriptSerializer 클래스에 사용할 수 있다고 생각했습니다. 나는 심지어 여기 msdn에서 검색 : http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.maxjsonlength(v=vs.110).aspx – Saket

+0

제발 같은 참조를 찾을 수있는 위치를 말해 주시겠습니까? – Saket