Я отправляю объект JSON из своего приложения MonoTouch в свой контроллер Asp.MVC. Объект JSON имеет несколько строковых параметров. Один из параметров имеет строку с кодировкой base64. Строка base64 представляет собой представление изображения.HttpWebRequest с MonoTouch не публикует все данные
Издание является: На сервере, когда приходит запрос, иногда я получаю эту ошибку:
Unterminated string passed in. (49152).
Что еще хуже то, что это происходит только на производстве, не устр.
Теперь, номер 49152, варьируется от запроса. Я предполагаю, что строка JSON не будет полностью опубликована. Это отрезано. Я пробовал использовать Fiddler, чтобы замедлить пропускную способность, в случае, если причиной станет медленный интернет. Однако это не было причиной ни потому, что я не мог воспроизвести проблему с dev с этим.
Возможные проблемы, я вижу:
-
"\ 0" получение добавляется в конце строки Base64, как отмечено здесь: https://stackoverflow.com/a/710882/487940.Я действительно не думаю, что что-то не так с Base64, потому что данные становятся сериализованными в клиенте MonoTouch, поэтому, если что-то не так, то оно не будет сериализовано в первую очередь. - 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. Это должно быть что-то с просьбой.
Вы записали входную строку JSON, что у вас есть? Вероятно, это могло бы не закончиться должным образом из-за эвакуационных персонажей. Наличие этой строки JSON даст больше информации. – ramiramilu
thats, что я буду делать, но эта проблема происходит в prod, и текущая версия в prod не регистрирует JSON. следующий выпуск не будет делать через некоторое время. Однако есть ли способ перехватить запрос до того, как он будет перенаправлен на контроллер и десериализован? Потому что я могу получить необработанные данные и зарегистрировать их. – harsimranb
Вы можете использовать [Fiddler 2] (http://fiddler2.com) в Windows с вашим сервером или [Wireshark] (http://www.wireshark.org) в Mac OS X для перехвата HTTP-соединений. –