Why don't you use UploadFile WebClient through https if you want it to be safe? and this will automatically take care of adding multipart/form-data .
Example using UploadFile
http://msdn.microsoft.com/en-us/library/36s52zhs.aspx
And one more thing: encoding and encryption are two different things.
Edit:
You should probably mark your question as Silverlight if you are using WebClient in your WebClient project. In any case, the WebClient class in SL has no UploadData method. See Further Information:
http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.95%29.aspx
In any case, here is a working solution to your problem:
In your button, click this code:
OpenFileDialog dialog = new OpenFileDialog(); bool? retVal = dialog.ShowDialog(); if (retVal.HasValue && retVal == true) { using (Stream stream = dialog.File.OpenRead()) { MemoryStream memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); WebClient webClient = new WebClient(); webClient.Headers["Content-type"] = "multipart/form-data; boundary=---------------------------" + _boundaryNo; webClient.OpenWriteAsync(new Uri("http://localhost:1463/Home/File", UriKind.Absolute), "POST", new { Stream = memoryStream, FileName = dialog.File.Name }); webClient.OpenWriteCompleted += new OpenWriteCompletedEventHandler(webClient_OpenWriteCompleted); } }
and the event itself:
void webClient_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) { if (e.Error == null) { Stream responseStream = e.Result as Stream; dynamic obj = e.UserState; MemoryStream memoryStream = obj.Stream as MemoryStream; string fileName = obj.FileName; if (responseStream != null && memoryStream != null) { string headerTemplate = string.Format("-----------------------------{0}\r\n", _boundaryNo); memoryStream.Position = 0; byte[] byteArr = memoryStream.ToArray(); string data = headerTemplate + string.Format("Content-Disposition: form-data; name=\"pic\"; filename=\"{0}\"\r\nContent-Type: application/octet-stream\r\n\r\n", fileName); byte[] header = Encoding.UTF8.GetBytes(data); responseStream.Write(header, 0, header.Length); responseStream.Write(byteArr, 0, byteArr.Length); header = Encoding.UTF8.GetBytes("\r\n"); responseStream.Write(byteArr, 0, byteArr.Length); byte[] trailer = System.Text.Encoding.UTF8.GetBytes(string.Format("-----------------------------{0}--\r\n", _boundaryNo)); responseStream.Write(trailer, 0, trailer.Length); } memoryStream.Close(); responseStream.Close(); } }
where _boundaryNo private string _boundaryNo = DateTime.Now.Ticks.ToString("x");
I worked with Asp.Net MVC 4 and Silverlight 5.
Good luck :)