Question

Alors je suis en train de poster quelque chose à un serveur Web.

System.Net.HttpWebRequest EventReq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create("url");
System.String Content = "id=" + Id;
EventReq.ContentLength = System.Text.Encoding.UTF8.GetByteCount(Content);
EventReq.Method = "POST";
EventReq.ContentType = "application/x-www-form-urlencoded";
System.IO.StreamWriter sw = new System.IO.StreamWriter(EventReq.GetRequestStream(), System.Text.Encoding.UTF8);
sw.Write(Content);
sw.Flush();
sw.Close();

Attend bien, je suis mise en longueur du contenu en fonction de la taille des données encodées ... Quoi qu'il en soit, il échoue à sw.flush () avec « octets à écrire au flux Dépasser la taille Content-Length spécifiée »

StreamWriter est en train de faire un peu de magie derrière mon dos je ne suis pas au courant? Est-il possible que je peux regarder dans ce StreamWriter fait?

Était-ce utile?

La solution

D'autres réponses ont expliqué comment éviter cela, mais je pensais que je répondrais pourquoi ça se passe: vous se retrouver avec un marque l'ordre des octets avant votre contenu.

Vous pouvez éviter cela en appelant new UTF8Encoding(false) au lieu d'utiliser Encoding.UTF8. Voici un programme court pour démontrer la différence:

using System;
using System.Text;
using System.IO;

class Test    
{
    static void Main()
    {
        Encoding enc = new UTF8Encoding(false); // Prints 1 1
        // Encoding enc = Encoding.UTF8; // Prints 1 4
        string content = "x";
        Console.WriteLine(enc.GetByteCount("x"));
        MemoryStream ms = new MemoryStream();
        StreamWriter sw = new StreamWriter(ms, enc);
        sw.Write(content);
        sw.Flush();
        Console.WriteLine(ms.Length);
    }

}

Autres conseils

Peut-être faire comme plus facile:

using(WebClient client = new WebClient()) {
    NameValueCollection values = new NameValueCollection();
    values.Add("id",Id);
    byte[] resp = client.UploadValues("url","POST", values);
}

Ou voir pour une discussion qui permet d'utiliser comme:

client.Post(destUri, new {
     id = Id // other values here
 });

Vous devez pas définir explicitement ContentLength, car il sera mis automatiquement à la taille des données écrites pour demander flux lorsque vous le fermez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top