2014-01-24 37 views
-1

我從我的MonoTouch應用程序發佈JSON對象到我的Asp.MVC控制器。 JSON對象有幾個字符串參數。其中一個參數具有base64編碼的字符串。 base64字符串是圖像的表示。HttpWebRequest與MonoTouch不發佈所有數據

的問題是:在服務器上,當請求到來時,有時我得到這個錯誤:

Unterminated string passed in. (49152). 

更糟糕的是,這只是發生在生產,而不是dev的。

現在,號碼49152,因要求而異。我的猜測是JSON字符串沒有完全發佈。它正在被切斷。我嘗試過使用Fiddler來減慢我的帶寬,以防萬一互聯網速度緩慢。然而,這不是因爲我不能在dev上重現這個問題。

可能出現的問題,我看到:

  1. 「\ 0」 得到追加的Base64編碼字符串的結尾,因爲這裏要注意: https://stackoverflow.com/a/710882/487940我真的不認爲Base64有什麼問題,因爲數據在MonoTouch客戶端中被序列化,所以如果有什麼錯誤,那麼它就不會序列化。
  2. MonoTouch HttpWebRequest未公佈所有數據。這可能是IMO的問題。發送的請求消失了。

完整堆棧跟蹤:

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

多數民衆贊成我會做什麼,但這個問題發生在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或您的請求正確傳遞,並與請求主體的大小(以字節爲單位)相對應。