title: C# HttpWebRequest form upload
body: <p>im trying to automate a file upload from my C# program. This is the method to upload a file.</p>
  
  <pre><code>public static string UploadFileEx(string uploadfile, string url,
                              string fileFormName, string contenttype, NameValueCollection querystring,
                              CookieContainer cookies)
      {
          if ((fileFormName == null) ||
              (fileFormName.Length == 0))
          {
              fileFormName = "file";
          }
  
          if ((contenttype == null) ||
              (contenttype.Length == 0))
          {
              contenttype = "application/octet-stream";
          }
  
  
          string postdata;
          postdata = "";
          if (querystring != null)
          {
              foreach (string key in querystring.Keys)
              {
                  postdata += key + "=" + querystring.Get(key) + "&amp;";
              }
          }
          Uri uri = new Uri(url + postdata);
  
          string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
          HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
  
          var sp = webrequest.ServicePoint;
          var prop = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic);
          prop.SetValue(sp, (byte)0, null);
  
          webrequest.CookieContainer = cookies;
          webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
          webrequest.Method = "POST";
  
          webrequest.KeepAlive = true;
          webrequest.Referer = "http://www.iwi.hs-karlsruhe.de/scs/simulate/upload.jsp";
          webrequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
          webrequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1";
          webrequest.Headers.Add("Accept-Language:de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
          webrequest.Headers.Add("Accept-Encoding:gzip, deflate");
          webrequest.ProtocolVersion = HttpVersion.Version11;
  
  
          // Build up the post message header
  
          StringBuilder sb = new StringBuilder();
          sb.Append("--");
          sb.Append(boundary);
          sb.Append("\r\n");
          sb.Append("Content-Disposition: form-data; name=\"");
          sb.Append(fileFormName);
          sb.Append("\"; filename=\"");
          sb.Append(Path.GetFileName(uploadfile));
          sb.Append("\"");
          sb.Append("\r\n");
          sb.Append("Content-Type: ");
          sb.Append(contenttype);
          sb.Append("\r\n");
          sb.Append("\r\n");
  
          string postHeader = sb.ToString();
          byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);
  
          // Build the trailing boundary string as a byte array
  
          // ensuring the boundary appears on a line by itself
  
          byte[] boundaryBytes =
                 Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
  
          FileStream fileStream = new FileStream(uploadfile,
                                      FileMode.Open, FileAccess.Read);
          long length = postHeaderBytes.Length + fileStream.Length +
                                                 boundaryBytes.Length;
          webrequest.ContentLength = length;
  
          Stream requestStream = webrequest.GetRequestStream();
  
          // Write out our post header
  
          requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
  
          // Write out the file contents
  
          byte[] buffer = new Byte[checked((uint)Math.Min(4096,
                                   (int)fileStream.Length))];
          int bytesRead = 0;
          while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
              requestStream.Write(buffer, 0, bytesRead);
  
          // Write out the trailing boundary
  
          requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
          try
          {
              WebResponse responce = webrequest.GetResponse();
              Stream s = responce.GetResponseStream();
              StreamReader sr = new StreamReader(s);
  
              return sr.ReadToEnd();
          }
          catch (Exception ex)
          {
              return ex.Message;
          }
  
      }
  </code></pre>
  
  <p>When i call it like this on a sample image upload page, everything works fine:</p>
  
  <pre><code>string outdata = UploadFileEx(uploadfile,
               "http://www.minpic.de/upload_file.php", "uploadfile0", "image/jpg",
               null, null);
  </code></pre>
  
  <p>But when i try to upload it to the page of my high school it's not working. The upload page is secured by a login form. So i call the upload page to get the initail Cookie, the i post the login credentials and get the right result. So i can see the following upload form:</p>
  
  <pre><code>&lt;form action="../simulate" method=post enctype="multipart/form-data"&gt;&lt;br /&gt;Choose your inputdata file (xml).&lt;br /&gt;&lt;input type=file size=50 maxlength=100000 name="Datei" accept="text/xml"&gt;&lt;br&gt;&lt;br&gt;&lt;input type=submit value="Send"&gt;&lt;/form&gt;
  </code></pre>
  
  <p>When i then post the image (i know the expected type is xml but the page answers a error what i want in this case ...) my upload function return a error code 500. Here is what wireshark says for the browsers post:</p>
  
  <blockquote>
    <p>POST /scs/simulate HTTP/1.1
    Host: some host
    Connection: keep-alive
    Content-Length: 3874
    Cache-Control: max-age=0
    Origin: same host
    User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryP3Ti6rxYcN1ov7JD
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,<em>/</em>;q=0.8
    Referer: some url
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
    Cookie: SCS_COOKIE=Default=DE$$MarkePlaceLang=DE; JSESSIONID=B459541362241F66D9312AF157262D25</p>
  </blockquote>
  
  <p>and here the post from c#:</p>
  
  <blockquote>
    <p>POST same as above
    Content-Type: multipart/form-data; boundary=----------8cf828671b8365c
    Referer: some url
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,<em>/</em>;q=0.8
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1
    Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Host: same host as above
    Cookie: JSESSIONID=FFE0B7530FFE6A3C8F15FD8A900865B0
    Content-Length: 3847
    Expect: 100-continue
    Connection: Keep-Alive</p>
  </blockquote>
  
  <p>The only difference i can see is the Expect: 100-continue ... Is there a problem with the packet size or something ? </p>
  
  <p>Thx in advance.</p>