2010-08-16 4 views
2

Je suis en train de créer une application console qui rassemble des données et les envoie ensuite à une page php via une requête POST. Ceci est mon code C#:L'application console envoie uniquement les 46 premiers caractères d'une requête POST

HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("http://localhost/log.php"); 
Request.Method = "POST"; 
Request.ContentType = "application/x-www-form-urlencoded"; 
string PostData = "data=" + UserOutput; 
Request.ContentLength = PostData.Length; 

StreamWriter stOut = new StreamWriter(Request.GetRequestStream(), System.Text.Encoding.ASCII); 
stOut.Write(PostData); 
stOut.Close(); 

Et la page PHP (log.php):

<?php 

file_put_contents('log.txt', $_POST['data']); 

?> 

Remarque Je n'utilise file_put_contents pour tester si tout fonctionne bien, ce n'est pas ce que je veux finir par faire.

La longueur des données de message à envoyer est de plus de 2 000 caractères, et la longueur de contenu correcte est renvoyée par Request.ContentLength = PostData.Length;, donc ce n'est pas le problème. Mais chaque fois que j'essaie cela, il envoie seulement les 46 premiers caractères de mes données POST.

Je dois admettre à ce stade que j'ai copié la plupart du code, car je ne suis pas très expérimenté en C#.

Toute aide serait formidable, merci.

Répondre

3

Est-ce que le 47ème caractère "&" par hasard? Vous avez affirmé que vos données sont codées en URL, mais que vous n'avez pas encodé d'URL dans le code que vous avez fourni. S'il y a un « & » qui indiquerait à PHP qu'il était sur le point d'accepter un nouveau paramètre de forme ...

Une façon de vérifier (à l'exception de l'utilisation HttpUtility.UrlEncode) serait d'utiliser Fiddler ou Wireshark pour voir ce effectivement se passe au niveau du réseau.

+0

Aha, je pensais jamais vraiment de cela. C'est le problème et je m'assurerai d'UrlEncode à partir de maintenant. Merci :) – Kratz

0

Le Close() devrait le gérer, mais vous voudrez peut-être essayer un .Flush() juste avant cela.

0

Si vous n'envoyez qu'un gros volume de données, il serait préférable d'omettre l'en-tête Content-type et de créer PostData == UserOutput.

Vous pouvez ensuite enregistrer avec

$s = fopen("php://input", "r"); 
file_put_contents('log.txt', $s);