WebRequest POST avec les deux fichiers et de paramètres

Je suis en train de télécharger un fichier et l'envoyer un peu d'paramètres de mon site en utilisant .NET /C#. Après avoir lu quelques tutoriels qui ne soit quelques paramètres ou un fichier, j'ai essayé, en vain, de les combiner entre eux. Voici comment j'essaie de le faire:

WebRequest req = WebRequest.Create(baseURL + "upload");
req.Credentials = new NetworkCredential(username, password);
String boundary = "B0unD-Ary";
req.ContentType = "multipart/form-data; boundary=" + boundary;
req.Method = "POST";
((HttpWebRequest)req).UserAgent = "UploadTester v0.1";

string postData = "--" + boundary + "\nContent-Disposition: form-data\n";
postData += "myId=123&someFk=456";
postData += "\n--" + boundary + "\nContent-Disposition: form-data; name=\"file\" filename=\"upload.pdf\" Content-Type: application/pdf\n\n";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);

byte[] filedata = null;
using (BinaryReader reader = new BinaryReader(File.OpenRead("myfile.pdf")))
    filedata = reader.ReadBytes((int)reader.BaseStream.Length);

req.ContentLength = byteArray.Length + filedata.Length;
req.GetRequestStream().Write(byteArray, 0, byteArray.Length);
req.GetRequestStream().Write(filedata, 0, filedata.Length);

WebResponse response = req.GetResponse();
Stream data = response.GetResponseStream();
StreamReader sReader = new StreamReader(data);
String sResponse = sReader.ReadToEnd();
response.Close();

Quand je l'execute, je reçois un 500 exception, en disant: "section d'en-Tête a plus que 10240 bnytes (peut-être qu'il n'est pas correctement terminé)" et Wireshark m'informe que la demande a été envoyé un paquet mal formé, où le MIME multipart a été mal formé.

Il y a probablement plusieurs problèmes, de sorte s'il vous plaît laissez-moi savoir à tous les problèmes que vous pouvez repérer

Mise à jour: pour séparer MIME à partir de C#/.NET, j'ai donné naissance à un fil ici: https://stackoverflow.com/questions/1880002/error-in-mime-packet-for-http-post

Mise à jour 2: Si le backend, en effet, a des problèmes avec la longueur du contenu, en disant que le nombre d'octets disponibles pour la lecture est inférieure à la teneur indiquée la longueur. MAIS! Si je réduis la longueur du contenu dans req.ContentLength en conséquence, je n'ai pas une mémoire tampon de taille suffisamment grande pour l'envoi des données. Des suggestions?

Mise à jour 3: en Fait, il ressemble à l'en-tête a une trop grande taille par rapport à la quantité de données qu'il contient

Si vous êtes en utilisant .NET >= 4.0 passer à ma réponse un moyen plus facile de le faire.

OriginalL'auteur niklassaers | 2009-12-09