2014-01-24 2 views
-1

Я отправляю объект JSON из своего приложения MonoTouch в свой контроллер Asp.MVC. Объект JSON имеет несколько строковых параметров. Один из параметров имеет строку с кодировкой base64. Строка base64 представляет собой представление изображения.HttpWebRequest с MonoTouch не публикует все данные

Издание является: На сервере, когда приходит запрос, иногда я получаю эту ошибку:

Unterminated string passed in. (49152). 

Что еще хуже то, что это происходит только на производстве, не устр.

Теперь, номер 49152, варьируется от запроса. Я предполагаю, что строка JSON не будет полностью опубликована. Это отрезано. Я пробовал использовать Fiddler, чтобы замедлить пропускную способность, в случае, если причиной станет медленный интернет. Однако это не было причиной ни потому, что я не мог воспроизвести проблему с dev с этим.

Возможные проблемы, я вижу:

  1. "\ 0" получение добавляется в конце строки Base64, как отмечено здесь: https://stackoverflow.com/a/710882/487940. Я действительно не думаю, что что-то не так с Base64, потому что данные становятся сериализованными в клиенте MonoTouch, поэтому, если что-то не так, то оно не будет сериализовано в первую очередь.
  2. MonoTouch HttpWebRequest не публикует все данные. Вероятно, это проблема ИМО. Отправленный запрос пропал.

Полный Трассировка стека:

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, прежде чем он получает направляется к контроллеру. Если я могу перехватить его, я могу получить необработанные данные и зарегистрировать их. Есть ли способ сделать это в Asp.Net MVC? Как я уже говорил выше, я действительно не думаю, что что-то не так с строкой Base64. Это должно быть что-то с просьбой.

+0

Вы записали входную строку JSON, что у вас есть? Вероятно, это могло бы не закончиться должным образом из-за эвакуационных персонажей. Наличие этой строки JSON даст больше информации. – ramiramilu

+0

thats, что я буду делать, но эта проблема происходит в prod, и текущая версия в prod не регистрирует JSON. следующий выпуск не будет делать через некоторое время. Однако есть ли способ перехватить запрос до того, как он будет перенаправлен на контроллер и десериализован? Потому что я могу получить необработанные данные и зарегистрировать их. – harsimranb

+1

Вы можете использовать [Fiddler 2] (http://fiddler2.com) в Windows с вашим сервером или [Wireshark] (http://www.wireshark.org) в Mac OS X для перехвата HTTP-соединений. –

ответ

0

Вместо того, чтобы отправлять строчную кодировку base64, я закончил реализацию Post Post MultiData и отправил массив байтов. Пока, похоже, это решает проблему.

0

Пожалуйста, убедитесь, что Content-Length или ваш запрос передан правильно и соответствует размеру вашего тела запроса (в байтах).

Смежные вопросы