Hi Joerg,
Thank for your feedback. I tried that but the request seems to fail.
I am note sure that my code does exactly what an html form does...
here is my sample code, do you see anything wrong?
--------------------------------
CookieContainer cookies = new CookieContainer();
string uri = uriString;
// cast the WebRequest to a HttpWebRequest since we're using HTTPS
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Credentials = CredentialCache.DefaultCredentials;
httpWebRequest.CookieContainer = cookies;
//add secure certificate
X509Certificate x509 = X509Certificate.CreateFromCertFile(@"C:\Documents and
Settings\jwax.IMMIGRATIONLAW\My
Documents\SEVIS\mayo\digital_certificates\mayoipo.cer");
httpWebRequest.ClientCertificates.Add(x509);
WebResponse webResponse = httpWebRequest.GetResponse();
string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest2.Credentials = CredentialCache.DefaultCredentials;
httpWebRequest2.CookieContainer = cookies;
httpWebRequest2.ContentType = "multipart/form-data; boundary=" + boundary;
httpWebRequest2.Method = "POST";
//add secure certificate
httpWebRequest2.ClientCertificates.Add(x509);
// 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=\"file\"; filename=\"");
sb.Append(Path.GetFileName(xmlFile));
sb.Append("\"");
sb.Append("\r\n");
//sb.Append("Content-Type: application/octet-stream");
sb.Append("Content-Type: multipart/form-data");
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(xmlFile, FileMode.Open,
FileAccess.Read);
long length = postHeaderBytes.Length + fileStream.Length +
boundaryBytes.Length;
httpWebRequest2.ContentLength = length;
Stream requestStream = httpWebRequest2.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);
WebResponse webResponse2 = httpWebRequest2.GetResponse();
//Read Response into String
StreamReader reader = new StreamReader(webResponse2.GetResponseStream() );
string responseString = reader.ReadToEnd();
reader.Close();
Console.Write(responseString);
return responseString;
--------------------------------
Thx,
Jonathan
[quoted text, click to view] "Joerg Jooss" <joerg.jooss@gmx.net> wrote in message
news:uk9a4rVREHA.1448@TK2MSFTNGP11.phx.gbl...
> Jonathan Wax wrote:
> > Hi,
> >
> > I spent the last week looking for an answer to the following question:
> > How can you upload an xml file to an HTTPS server with a specific
> > certificate.
> > Basically doing the same as this html form in c# code:
> >
> > <form method="post" enctype="multipart/form-data"
> > action="
https://www.site.com/upload/"/>
> > <input type="file" name="xml" id="xml="><br>
> > <input type="text" name="batchid" id="batchid="><br>
> > <input type="text" name="schoolcode" id="schoolcode="><br><br>
> > <input type="submit" value="Submit">
> > </form>
> >
> > I wanted to use the WebClient.UploadFile(filename.xml) method but I
> > could not find how
> > to do this with a specific Certificate.
>
> You'll hvae to use HttpWebRequest to do that.
>
> Cheers,
>
>
> --
> Joerg Jooss
> joerg.jooss@gmx.net