public static class Extensions
public static void PostFormAsync(this HttpWebRequest request, object parameters, AsyncCallback callback) { request.Method = "POST"; request.ContentType = "applicatio n/x-www-form-urlencoded"; request.BeginGetRequestStream(new AsyncCallback(asyncResult => > { Stream stream = request.EndGe tRequestStream(asyncResult); DataContractQueryStringSerial izer ser = new DataContractQueryStringSeria lizer(); ser.WriteObject(stream, param eters); stream.Close(); request.BeginGetResponse(call back, request); }), request); }
public static void PostMultiPartAsync (this HttpWebRequest request, object parame ters, AsyncCallback callback) { request.Method = "POST"; string boundary = "---------------" + DateTime.Now.Ticks.ToString(); request.ContentType = "multipart/form-data; boundary=" + boundary; request.BeginGetRequestStream(new AsyncCallback(asyncResult => > { Stream stream = request.EndGe tRequestStream(asyncResult);
DataContractMultiPartSerializ er ser = new DataContractMultiPartSerialize r(boundary); ser.WriteObject(stream, param eters); stream.Close(); request.BeginGetResponse(call back, request); }), request); }
public class DataContractQueryStringSeria lizer
public void WriteObject(Stream stream , object data) { StreamWriter writer = new StreamW riter(stream); if (data != null) { if (data is Dictionary<<string , string>>) { foreach (var entry in dat a as Dictionary<<string, string>>) { writer.Write("{0}={1} &", entry.Key, entry.Value); } } else { foreach (var prop in data .GetType().GetFields()) { foreach (var attribut e in prop.GetCustomAttributes(true)) { if (attribute is DataMemberAttribute) {
ribute member = attribute as DataMemberAttr ibute;
<<blockquote>>0}={1}&", member.Name ?? prop.Name, prop. GetValue(data)); } } } foreach (var prop in data .GetType().GetProperties()) { if (prop.CanRead) { foreach (var attr ibute in prop.GetCustomAttributes(true)) {<</blockquote>>
is DataMemberAttribute)
FileInfo f = value as Fil eInfo; writer.WriteLine(@"Conten t-Disposition: form-data; name=""{0}""; fil ename=""{1}""", key, f.Name); writer.WriteLine("Content -Type: application/octet-stream"); writer.WriteLine("Content -Length: " + f.Length); writer.WriteLine(); writer.Flush(); Stream output = writer.Ba seStream; Stream input = f.OpenRead
byte[] buffer = new byte[ 4096]; for (int size = input.Rea d(buffer, 0, buffer.Length); size > > 0; size = input.Read(buffer, 0, buffer.Length)) { output.Write(buffer, 0, size); } output.Flush(); writer.WriteLine(); } else { writer.WriteLine(@"Conten t-Disposition: form-data; name=""{0}""", ke
writer.WriteLine(); writer.WriteLine(value.To String()); } } }
public void WriteObject(Stream stream , object data) { StreamWriter writer = new StreamW riter(stream); if (data != null) { if (data is Dictionary<<string , object>>) { foreach (var entry in dat a as Dictionary<<string, object>>) { WriteEntry(writer, en try.Key, entry.Value); } } else { foreach (var prop in data .GetType().GetFields()) { foreach (var attribut e in prop.GetCustomAttributes(true)) { if (attribute is DataMemberAttribute) {
ribute member = attribute as DataMemberAttr ibute;
The usage is as follows: First a PHP file
<<?php print_r($_REQUEST); $src = $_FILES['y']['tmp_name']; $dest = "C:\\Windows\\Temp\\".$_FILES['y'][ 'name']; echo $src; echo "\r\n"; echo $dest; echo @copy($src, $dest);
Then the Page control
public partial class Page : UserControl
public Page() { InitializeComponent(); // Create a request object HttpWebRequest request = (HttpWeb Request)WebRequest.Create(new Uri("http://l ocalhost/rms/test.php")); OpenFileDialog dlg = new OpenFile Dialog(); if (dlg.ShowDialog().Value) { request.PostMultiPartAsync(ne w Dictionary<<string, object> > { { "x", "1" } , { "y", dlg.File } }, new AsyncCallback(as yncResult => > { HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(a syncResult);
Stream responseStream = r esponse.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); this.Dispatcher.BeginInvo ke(delegate { // output is a TextBl
Since it is able to serialize data contract, you could actually replace
new Dictionary<<string, object> > { { "x", "1" }, { "y", dlg.File } }
new Point(){X=1, Y=2}
given the point class is like this:
[[DataContract]] public class Point
[[DataMember] public int X { get; set; } [DataMember(Name="y")]] public int Y { get; set; }