使用MonoTouch的HttpWebRequest不发布所有数据

时间:2014-01-24 19:39:54

标签: c# ios asp.net-mvc json xamarin.ios

我将MonoTouch应用程序中的JSON对象发布到我的Asp.MVC控制器。 JSON对象有一些字符串参数。其中一个参数有一个base64编码的字符串。 base64字符串是图像的表示。

问题是:在服务器上,当请求进入时,有时我会收到此错误:

Unterminated string passed in. (49152).  

更糟糕的是,这只发生在制作上,而不是开发。

现在,号码49152因请求而异。我的猜测是JSON字符串没有完全发布。它被切断了。我已经尝试过使用Fiddler减慢我的带宽,万一因为慢速互联网将成为原因。然而,这也不是原因,因为我无法在dev上重现这个问题。

可能的问题,我明白了:

  1. “\ 0”附加在Base64字符串的末尾,如下所示:https://stackoverflow.com/a/710882/487940我真的认为Base64没有任何问题,因为数据是在MonoTouch客户端中进行序列化,所以如果出现任何问题,那么它首先不会序列化。
  2. MonoTouch HttpWebRequest未发布所有数据。这可能是IMO的问题。发送的请求变坏了。
  3. 完整堆栈跟踪:

       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字符串没有任何问题。它必须符合要求。

2 个答案:

答案 0 :(得分:0)

请确保Content-Length或您的请求正确传递,并且与请求正文的大小(以字节为单位)相对应。

答案 1 :(得分:0)

我没有发送base64编码的字符串,而是最终实现了一个MultiData Form Post,并发送了字节数组。到目前为止,这似乎解决了这个问题。