2017-07-18 96 views
0

我有一個web服務,它返回一個json字符串。 Alltogehter我有432個JSON對象與blob數據。 在每個Webrequest中,我得到了30個432的對象,直到432的Iam。 對於每個反序列化,反序列化的時間增加。 30對象需要9秒鐘,在第二次血化時我們需要15秒。 463對象是1,3 GB。用30個blob對象反序列化大型json數據

如何調整我的代碼,30個對象不需要9秒或更多?

的字符串看起來像下面這樣:

{ 
    "d:" [ 
    { 
     "id": "1", 
     "groesse": 2515221, 
     "byteasbase64string": "the base64 string" 
    }, 
    { 
     "id": "2", 
     "groesse": 887748, 
     "byteasbase64string": "the base64 string" 
    } 
    ] 
} 

繼承人我的C#代碼:

List<db.dwaprotokolldatei> getProtokolldatei = new List<db.dwaprotokolldatei>(); 
using (postStreamGPD = resGPD.GetResponseStream()) 
{ 
    using (srGPD = new StreamReader(postStreamGPD)) 
    { 
     string responseFromServerGPD = srGPD.ReadToEnd(); // Long running time 
     getProtokolldatei = JsonConvert.DeserializeObject<db.rootobject>(responseFromServerGPD).d;// Long running time 
     responseFromServerGPD = ""; 
    } 
} 

reqGPD = null; 
postDataAsBytesGPD = null; 
postStreamGPD.Dispose(); 
postStreamGPD = null; 
resGPD.Dispose(); 
resGPD = null; 
srGPD.Dispose(); 
srGPD = null; 

GC.Collect(); 

的WebRequest:

reqGPD = (HttpWebRequest)HttpWebRequest.Create("*****"); 
         reqGPD.Method = "POST"; 
         reqGPD.ContentType = "application/json"; 
       mobileJSON = ConvertTOJSONMobile(existingMobile); 

         postDataAsBytesGPD = Encoding.UTF8.GetBytes(mobileJSON); 
         postStreamGPD = reqGPD.GetRequestStream(); 
         postStreamGPD.Write(postDataAsBytesGPD, 0, postDataAsBytesGPD.Length); 
         postStreamGPD.Flush(); 
         postStreamGPD.Dispose(); 

          resGPD = reqGPD.GetResponse(); 
+0

只爲您的信息 - 在包裹的東西'using'構建這樣已經呼籲包裹實例'的Dispose()'方法(在你的情況,'postStreamGPD'和'srGPD')。你不需要手動完成。 –

+0

好的,但這並不能解決我的問題。 – Pascal

+0

不,這就是爲什麼我沒有給它作爲答案,只是一個評論。 =) –

回答

0

在web配置你需要:

<configuration> 
     <system.web.extensions> 
      <scripting> 
       <webServices> 
        <jsonSerialization maxJsonLength="50000000"/> 
       </webServices> 
      </scripting> 
     </system.web.extensions> 
    </configuration> 
+0

這個問題不是來自webservice。在客戶端中,我從webservice調用中獲取對象。這是問題,ReadToEnd的時間增加了。 – Pascal

0

你可以嘗試並行化嗎?

 List<db.dwaprotokolldatei> getProtokolldatei = new List<db.dwaprotokolldatei(); 
     Parallel.ForEach(urls, url => 
     { 
      var str = GetStringFromWebService(url); 
      getProtokolldatei.AddRange(Deserialize(str)); 
      DisposeAll(); 
     }); 
0

ReadToEnd()要快得多。

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
      using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      { 
       reader.ReadToEnd(); 
      }