我将MonoTouch应用程序中的JSON对象发布到我的Asp.MVC控制器。 JSON对象有一些字符串参数。其中一个参数有一个base64编码的字符串。 base64字符串是图像的表示。
问题是:在服务器上,当请求进入时,有时我会收到此错误:
Unterminated string passed in. (49152).
更糟糕的是,这只发生在制作上,而不是开发。
现在,号码49152因请求而异。我的猜测是JSON字符串没有完全发布。它被切断了。我已经尝试过使用Fiddler减慢我的带宽,万一因为慢速互联网将成为原因。然而,这也不是原因,因为我无法在dev上重现这个问题。
可能的问题,我明白了:
完整堆栈跟踪:
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)
更新
我想我会在它被路由到控制器之前拦截asp.net mvc中的请求。如果我可以拦截它,我可以获取原始数据并记录它。无论如何在Asp.Net MVC中这样做?正如我在上面指出的那样,我真的认为Base64字符串没有任何问题。它必须符合要求。
答案 0 :(得分:0)
请确保Content-Length或您的请求正确传递,并且与请求正文的大小(以字节为单位)相对应。
答案 1 :(得分:0)
我没有发送base64编码的字符串,而是最终实现了一个MultiData Form Post,并发送了字节数组。到目前为止,这似乎解决了这个问题。