2014-01-24 2 views
-1

내 MonoTouch 응용 프로그램에서 JSON 개체를 내 Asp.MVC 컨트롤러에 게시하고 있습니다. JSON 객체에는 몇 개의 문자열 매개 변수가 있습니다. 매개 변수 중 하나에는 base64 인코딩 된 문자열이 있습니다. base64 문자열은 이미지의 표현입니다.HttpWebRequest with MonoTouch 모든 데이터를 게시하지 않습니다

문제는 다음과 같습니다 이것은 단지 생산에서 발생하는 것이 더 나쁜 것은

Unterminated string passed in. (49152). 

, 개발하지 : 요청이 들어 오면 서버에서, 때로는이 오류가 발생합니다.

숫자 49152는 요청에 따라 달라집니다. 내 생각 엔 JSON 문자열이 완전히 게시되지 않는다는 것입니다. 그것은 끊어지고 있습니다. 나는 느린 인터넷이 원인 일 경우를 대비해 내 대역폭을 줄이기 위해 Fiddler를 사용해 보았습니다. 그러나 그 이유는 dev에 문제를 재현 할 수 없기 때문이 아닙니다.

가능한 문제는, 내가 참조 :

  1. "\ 0"여기에 언급 한 바와 같이, Base64로 문자열의 끝에 추가하기 : https://stackoverflow.com/a/710882/487940. MonoTouch 클라이언트에서 데이터가 직렬화되기 때문에 Base64에 문제가 있다고 생각하지 않습니다. 잘못된 것이 있으면 처음부터 직렬화되지 않을 것입니다.
  2. MonoTouch HttpWebRequest이 (가) 모든 데이터를 게시하지 않습니다. 이것은 아마도 IMO 문제 일 것입니다. 전송 된 요청이 잘못되었습니다.

전체 스택 추적 : 나는이 컨트롤러에 전달되기 전에 내가 asp.net의 MVC에서 요청을 가로 챌 것이라고 생각했다

System.ArgumentException: Unterminated string passed in. (49152): 
    .....LONG JSON STRING WHICH IS MISSING THE END **" }** and possible other characters. 
    at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeString() 
     at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) 
     at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth) 
     at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) 
     at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer) 
     at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) 
     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.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 

UPDATE. 만약 내가 그것을 가로 챌 수 있다면, 나는 원시 데이터를 얻고 그것을 기록 할 수있다. 어쨌든 Asp.Net MVC에서 이것을 수행 할 수 있습니까? 위에서 지적한 것처럼 실제로 Base64 문자열에 문제가 있다고 생각하지 않습니다. 그것은 요청과 함께해야합니다.

+0

입력 한 JSON 문자열을 기록 했습니까? 아마도 이스케이프 문자로 인해 제대로 종료되지 않았을 수 있습니다. JSON 문자열을 사용하면 더 많은 정보를 얻을 수 있습니다. – ramiramilu

+0

thats 내가 할 일은 없지만이 문제는 prod에서 발생하며 prod의 현재 버전은 JSON을 기록하지 않습니다. 다음 릴리스는 잠시 동안하지 않습니다. 그러나 컨트롤러에 전달되고 비 직렬화되기 전에 요청을 가로 챌 수있는 방법이 있습니까? 거기에서 원시 데이터를 가져 와서 로그 할 수 있기 때문입니다. – harsimranb

+1

서버를 실행하는 Windows에서 [Fiddler 2] (http://fiddler2.com)를 사용하거나 Mac OS X에서 [Wireshark] (http://www.wireshark.org)를 사용하여 HTTP 연결을 차단할 수 있습니다. –

답변

0

Base64로 인코딩 된 문자열을 보내는 대신 MultiData Form Post를 구현하고 바이트 배열을 보내는 것으로 끝 맺었습니다. 지금까지 문제가 해결 된 것 같습니다.

0

Content-Length 또는 요청이 올바르게 전달되었으며 요청 본문의 크기 (바이트)에 해당하는지 확인하십시오.

관련 문제