2017-06-18 1 views
1

Je travaille actuellement sur une application simple qui utilise des objets JSON pour POST à ​​une API et obtient les données de réponse. Toutefois, lorsque j'exécute la méthode POST, la réponse POST est si grande que je rencontre l'exception OutOfMemory.C# OutOfMemory Exception lors de la lecture de Post Response

J'utilise actuellement WebClient et CookieContainer pour le processus:

string jsonObject ="...."; //Example JSON string - It's very small 

using (var client = new WebClient()) 
{ 
    var auth = new NameValueCollection(); 
     values["username"] = "username"; 
     values["password"] = "password"; 

    client.uploadValues(endpoint,auth); 

    // This is causing the OutOfMemory Exception 
    var response = client.uploadString(endpoint, jsonObject); 

} 

J'ai étudié la question, et ont mis la propriété AllowStreamBuffering faux.

client.AllowStreamBuffering() = false; 

Cependant, je rencontre toujours la question, et je ne sais pas comment contrôler la réponse POST.


Mise à jour: 7/5/2017

Merci à suggestions @ Tim, j'ai déménagé à un courant de la réponse, mais je rencontre des problèmes en ce qui concerne la réponse réelle. Après avoir écrit le JSON (en tant que chaîne) au point de fin avec une méthode POST, le script reste bloqué pour essayer de lire la réponse.

String endPoint = @"http://example.com/v1/api/"; 
    String json = @"...."; 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint); 
    request.Method = "POST"; 
    request.KeepAlive = false; 
    request.AllowReadStreamBuffering = false; 

    /* Pretend this middle part does the Authorization with username and password. */ 
    /* I have actually authenticated using the above method, and passed a key to the request */ 

    //This part POST the JSON to the API 
    using (StreamWriter writeStream = new StreamWriter(request.GetRequestStream())) 
     { 
      writeStream.Write(json); 
      writeStream.Flush(); 
      writeStream.Close(); 
     } 

    //This bottom part opens up a console, but never reads or loads the data 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    StreamReader reader = new StreamReader(response.GetResponseStream()); 

Je me demande si le JSON n'est pas encodé probablement.


(Side Note: Je l'ai regardé écrire la réponse, ligne par ligne sur un fichier, mais il est la réponse qui est l'origine du problème - http://cc.davelozinski.com/c-sharp/fastest-way-to-read-text-files)

+0

La réponse ici semble liée à votre problème: https://stackoverflow.com/questions/15163451/system-outofmemoryexception-was-thrown-webclient-downloadstringasynch – Tim

+0

Salut Tim, merci pour l'info. Je n'ai pas essayé d'utiliser HttpWebRequest pour getResponse(), mais je le mettrai à jour si c'est la solution. –

+0

Vous devrez peut-être utiliser un flux, BeginGetResponse devrait vous permettre de récupérer toute la réponse en morceaux – Tim

Répondre

0

j'ai pu résoudre mon propre problème. Pour l'en-tête, j'ai oublié d'encoder le JSON et de définir correctement le type de contenu pour l'API.

Voici exactement le même code ci-dessus pour le flux, mais avec un en-tête mis à jour et bufferedStream pour une efficacité accrue avec la gestion des données et de la mémoire.

String endPoint = @"http://example.com/v1/api/"; 
String json = @"....";//Example JSON string 

Byte[] jsonData = Encoding.UTF8.GetBytes(json); 

StreamWriter file = new StreamWriter(@"File Location"); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint); 
request.Method = "POST"; 
request.ContentType = "text/plain"; 
request.KeepAlive = false; 
request.AllowReadStreamBuffering = false; 
request.ContentLength = jsonData.Length; 

/* Pretend this middle part does the Authorization with username and password. */ 
/* I have actually authenticated using the above method, and passed a key to the request */ 

//This part POST the JSON to the API 
Stream writeStream = request.GetRequestStream(); 
writeStream.Write(jsonData, 0, jsonData.Length); 

//This conducts the reading/writing into the file 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
using (Stream receivedStream = response.GetResponseStream()) 
using (BufferedStream bs = new BufferedStream(receivedStream)) 
using (StreamReader sr = new StreamReader(bs)) 
{ 
     String s; 
     while ((s = sr.ReadLine()) != null) 
     { 
      file.WriteLine(s); 
     } 

} 

Beaucoup des méthodes ici proviennent du blog de Dave Lozinski en ce qui concerne la gestion de la mémoire, la lecture de flux, et flux d'écriture (bien qu'il utilise des fichiers au lieu de cours d'eau). Il est très utile de passer par le poste ci-dessus pour obtenir de l'aide.