Windows Phone 平台上的 Post 到服务器时的数据传输
原作者的Code链接:http://postclient.codeplex.com/
类:DownloadStringCompletedEventArgs:EventArgs ,为DownloadStringCompleted事件提供数据:下载下来的数据资源,执行异步操作时引发的异常
1 /// <summary> 2 /// 为DownloadStringCompleted事件提供数据 3 /// </summary> 4 public class DownloadStringCompletedEventArgs:EventArgs 5 { 6 #region 属性 7 8 /// <summary> 9 /// 通过DownloadStringAsynchronous方法下载的数据 10 /// </summary> 11 public string Result { get; private set; } 12 13 /// <summary> 14 /// 执行异步操作时引发的异常 15 /// </summary> 16 public Exception Error { get; private set; } 17 18 #endregion 19 20 #region 构造方法 21 22 /// <summary> 23 /// 创建一个含有指定返回数据的实例 24 /// </summary> 25 /// <param name="result">通过DownloadStringAsynchronous方法下载的数据</param> 26 public DownloadStringCompletedEventArgs(string result) 27 { 28 Result=result; 29 } 30 31 /// <summary> 32 /// 创建一个含有指定异常的实例 33 /// </summary> 34 /// <param name="ex">执行异步操作时引发的异常</param> 35 public DownloadStringCompletedEventArgs(Exception ex) 36 { 37 Error = ex; 38 } 39 #endregion 40 }
类:PostClient ,主要实现方法,PostClient(),3重载; DownloadStringAsync(Uri address) ,实现资源加载
1 /// <summary> 2 /// 包含将数据传送到HTTP Post 网络请求 和 从 HTTP Post 网络请求接收数据的常用方法 3 /// </summary> 4 public class PostClient 5 { 6 7 #region 成员 8 9 /// <summary> 10 /// Post数据请求 11 /// </summary> 12 StringBuilder _postData = new StringBuilder(); 13 14 #endregion 15 16 #region 事件 17 18 /// <summary> 19 /// 为DownloadStringCompleted 事件声明的委托 20 /// </summary> 21 /// <param name="sender">触发事件的对象</param> 22 /// <param name="e">持有已下载好的数据的参数</param> 23 public delegate void DownloadStringCompletedHandler(object sender, DownloadStringCompletedEventArgs e); 24 25 /// <summary> 26 /// 当异步资源下载操作完成是触发 27 /// </summary> 28 public event DownloadStringCompletedHandler DownloadStringCompleted; 29 30 #endregion 31 32 #region 构造方法 33 34 /// <summary> 35 /// 创建一个包含特殊参数的PostClient实例 36 /// </summary> 37 /// <param name="parameters">String格式的Post 参数。有效的字符串格式形如:“name=David&psd=123456”</param> 38 public PostClient(string parameters) 39 { 40 _postData.Append(parameters); 41 } 42 43 /// <summary> 44 /// 创建一个包含特殊参数的PostClient实例 45 /// </summary> 46 /// <param name="parameters">String列表格式的Post 参数。有效的字符串格式形如:“name=Divad”</param> 47 public PostClient(IList<string> parameters) 48 { 49 foreach (var element in parameters) 50 { 51 _postData.Append(string.Format("{0}&",element)); 52 } 53 } 54 55 /// <summary> 56 /// 创建一个包含特殊参数的PostClient实例 57 /// </summary> 58 /// <param name="parameters">字典格式的Post参数,有效的字典格式形如:“<"name","Divad">,<"psd",123456>”</param> 59 public PostClient(IDictionary<string, object> parameters) 60 { 61 foreach (var pair in parameters) 62 { 63 _postData.Append(string.Format("{0}={1}&",pair.Key,pair.Value)); 64 } 65 } 66 #endregion 67 68 #region 公有方法 69 70 /// <summary> 71 /// 从string格式的指定Uri中下载资源 72 /// </summary> 73 /// <param name="address">提供资源的URi地址</param> 74 public void DownloadStringAsync(Uri address) 75 { 76 HttpWebRequest request; 77 78 try 79 { 80 request = (HttpWebRequest)WebRequest.Create(address); 81 request.Method = "POST"; 82 request.ContentType = "application/x-www-form-urlencoded"; 83 request.BeginGetRequestStream(new AsyncCallback(RequestReady), request); 84 } 85 catch 86 { 87 if (DownloadStringCompleted!=null) 88 { 89 System.Windows.Deployment.Current.Dispatcher.BeginInvoke(delegate() 90 { 91 DownloadStringCompleted(this,new DownloadStringCompletedEventArgs(new Exception("创建HTTP POST请求时发生错误"))); 92 }); 93 } 94 throw; 95 } 96 } 97 98 #endregion 99 100 #region 私有方法 101 102 /// <summary> 103 /// 执行请求时准备执行的操作 104 /// </summary> 105 /// <param name="asyncResult">异步操作状态</param> 106 private void RequestReady(IAsyncResult asyncResult) 107 { 108 HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest; 109 110 using (Stream stream=request.EndGetRequestStream(asyncResult)) 111 { 112 using (StreamWriter writer=new StreamWriter(stream)) 113 { 114 writer.Write(_postData.ToString()); 115 writer.Flush(); 116 } 117 } 118 119 request.BeginGetResponse(new AsyncCallback(ResponseReady), request); 120 } 121 122 /// <summary> 123 /// 请求响应是准备执行的操作 124 /// </summary> 125 /// <param name="asyncResult"></param> 126 private void ResponseReady(IAsyncResult asyncResult) 127 { 128 HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest; 129 HttpWebResponse response = null; 130 131 try 132 { 133 response = (HttpWebResponse)request.EndGetResponse(asyncResult); 134 135 string result = string.Empty; 136 using (Stream responseStream=response.GetResponseStream()) 137 { 138 using (StreamReader reader=new StreamReader(responseStream)) 139 { 140 result = reader.ReadToEnd(); 141 } 142 } 143 144 if (DownloadStringCompleted!=null) 145 { 146 System.Windows.Deployment.Current.Dispatcher.BeginInvoke(delegate() 147 { 148 DownloadStringCompleted(this, new DownloadStringCompletedEventArgs(result)); 149 }); 150 } 151 } 152 catch 153 { 154 155 if (DownloadStringCompleted!=null) 156 { 157 System.Windows.Deployment.Current.Dispatcher.BeginInvoke(delegate() 158 { 159 DownloadStringCompleted(this,new DownloadStringCompletedEventArgs(new Exception("获取HTTP网络请求时发生错误!"))); 160 }); 161 } 162 } 163 } 164 #endregion 165 }