upload xml to https with certificate?

J

Jonathan Wax

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.

Thx
J.
 
J

Joerg Jooss

Jonathan said:
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,
 
J

Jonathan Wax

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;
 
Joined
Jun 11, 2008
Messages
1
Reaction score
0
I am trying to achieve the same goal, but it keeps on giving me this error:
The remote server returned an error: (400) Bad Request.

Does anyone have any ideas?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top