While I was working with the REST API to upload an image using RestSharp, I encountered a problem uploading it. I Googled the problem but did not find a specific answer for it. Although I found the solution and thought to share it since it can save a lot of time for other developers. I am assuming here that the reader is familiar with the REST API and RestSharp.
- [OperationContract]    
- [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]    
- public void NotesAttachment(Stream input)    
- {    
-     HttpApplicationState Application = HttpContext.Current.Application;    
-     HttpRequest Request = HttpContext.Current.Request;    
-     string sRequest = String.Empty;    
-     using (StreamReader stmRequest = new StreamReader(input, System.Text.Encoding.UTF8))    
-     {    
-         sRequest = stmRequest.ReadToEnd();    
-     }    
-     JavaScriptSerializer json = new JavaScriptSerializer();    
-     json.MaxJsonLength = int.MaxValue;    
-     Dictionary<string, object> dict = json.Deserialize<Dictionary<string, object>>(sRequest);    
-     string ext = dict["FILE_EXT"] as string;    
-     string mime = dict["FILE_MIME_TYPE"] as string;    
-     string image = dict["IMAGE_DATA"] as string;  
-     byte[] attachment = Convert.FromBase64String(image);  
- } 
What this method (the WS method) is expecting is a Stream object containing a file extension, file mime type and file data as an encoded string that is being converted to a byte array.
JavaScriptSerializer used in the example above is System.Web.Script.Serialization from systems.web.extension.dll.
This is how it is called from the client, I am using WPF as the client, but it can be called from a console or web app.
- private void CallRestNotesAttachment(string ext, string mime)  
- {  
-       var restClient = new RestClient("http://localhost:1608/Rest.svc/NotesAttachment");  
-       restClient.AddHandler("application/octet-stream", new RestSharp.Deserializers.JsonDeserializer());  
-       var request = new RestRequest(Method.POST);  
-       request.AddHeader("Content-Type", "application/octet-stream");  
-       Dictionary<string, object> dict = new Dictionary<string, object>();  
-       dict.Add("FILE_EXT", ext);  
-       dict.Add("FILE_MIME_TYPE", mime);  
-       byte[] imageBytes;  
-       using (FileStream fs = File.Open(@"C:\Users\anand.thakur\Desktop\1.wmv", FileMode.Open))  
-       {  
-           imageBytes = new BinaryReader(fs).ReadBytes((int)fs.Length);  
-       }  
-       string image = Convert.ToBase64String(imageBytes);  
-       dict.Add("IMAGE_DATA", image);  
-       byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dict));  
-       request.AddParameter("application/octet-stream", data, ParameterType.RequestBody);  
-       var response = restClient.Execute(request);  
-       JavaScriptSerializer json = new JavaScriptSerializer();  
-       Dictionary<string, object> dict1 = json.Deserialize<Dictionary<string, object>>(response.Content);  
-       MessageBox.Show("done");  
-   }  
 The RestSharp package is available through NuGet. JsonConvert can be found in Newtonsoft.Json, that is also available at NuGet.