public class RK_URLReqeust { ///summary ///Delegatedeclarationforservercallbacks. ////summary ///paramname=responseTheserverresponse./param public delegate void Callback( string response); ///summary ///Thecallbackfortheserverresponse. ////summary Callbac
public class RK_URLReqeust
{ /// <summary> /// Delegate declaration for server callbacks. /// </summary> /// <param name="response">The server response.</param> public delegate void Callback(string response); /// <summary> /// The callback for the server response. /// </summary> Callback callback; /// <summary> /// The actual URL. /// </summary> string url; string poststr; public Stream Image { get; set; } /// <summary> /// The server response to this URL request. /// </summary> public string Response { get; private set; } /// <summary> /// Constructor. /// </summary> public RK_URLReqeust(string url, string PostString, Callback callback) { // Initialize members this.url = url; this.callback = callback; poststr = PostString; //State = URLRequestState.Idle; } /// <summary> /// Send the URL request off! /// </summary> /// <returns>The server response.</returns> public void SendPost() { // Create a background thread to run the web request Thread t = new Thread(new ThreadStart(SendPostThreadFunc)); t.Name = "URLRequest_For_" + url; t.IsBackground = true; t.Start(); } /// <summary> /// The background thread for sending the url request. /// </summary> void SendPostThreadFunc() { string boundary = "--------boundary"; // Create the web request object HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Method = "POST"; webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.ContentType = "multipart/form-data; boundary=" + boundary; // Start the request webRequest.BeginGetRequestStream(new AsyncCallback(GetReqeustStreamCallback), webRequest); // Update our state //State = URLRequestState.Working; } /// <summary> /// Start the stream request. /// </summary> /// <param name="asynchronousResult">The asynchronous result object.</param> void GetReqeustStreamCallback(IAsyncResult asynchronousResult) { HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState; string boundary = "--------boundary"; // End the stream request operation Stream postStream = webRequest.EndGetRequestStream(asynchronousResult); // 构造发送数据 StringBuilder sb = new StringBuilder(); // 文件域的数据 sb.Append("--" + boundary); sb.Append("\r\n"); sb.Append("Content-Disposition: form-data; name=\"upload_file\";filename=\"image.jpg\""); sb.Append("\r\n"); sb.Append("Content-Type: "); sb.Append("image/jpeg"); sb.Append("\r\n\r\n"); string postHeader = sb.ToString(); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader); postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); // 输入文件流数据 byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)Image.Length))]; int bytesRead = 0; while ((bytesRead = Image.Read(buffer, 0, buffer.Length)) != 0) postStream.Write(buffer, 0, bytesRead); // 构造发送数据 StringBuilder sb2 = new StringBuilder(); // 文本域的数据,将user=eking&pass=123456 格式的文本域拆分 ,然后构造 foreach (string c in poststr.Split('&')) { string[] item = c.Split('='); if (item.Length != 2) { break; } string name = item[0]; string value = item[1]; sb2.Append("--" + boundary); sb2.Append("\r\n"); sb2.Append("Content-Disposition: form-data; name=\"" + name + "\""); sb2.Append("\r\n\r\n"); sb2.Append(value); sb2.Append("\r\n"); } byte[] postHeaderBytes2 = Encoding.UTF8.GetBytes("\r\n" + sb2.ToString()); // Add the post data to the web request postStream.Write(postHeaderBytes2, 0, postHeaderBytes2.Length); postStream.Close(); // Start the web request webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest); } /// <summary> /// Start the URL request. /// </summary> /// <param name="asynchronousResult">The asynchronous result object.</param> void GetResponseCallback(IAsyncResult asynchronousResult) { HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState; // End the get response operation HttpWebResponse response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult); Stream streamResponse = response.GetResponseStream(); StreamReader streamReader = new StreamReader(streamResponse); Response = streamReader.ReadToEnd(); streamResponse.Close(); streamReader.Close(); response.Close(); // Call the response callback if (callback != null) { callback(Response); } // Update state //State = URLRequestState.Done; } public byte[] StreamToBytes(Stream stream) { byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 设置当前流的位置为流的开始 stream.Seek(0, SeekOrigin.Begin); return bytes; } } 调用方式: StringBuilder builder = new StringBuilder(); builder.Append("type=photo&"); builder.Append("uid=" + JiaYuan._uid + "&"); builder.Append("token=" + JiaYuan._token);//参数用&分割 例如 username=****&password=**** RK_URLReqeust rk = new RK_URLReqeust("URL", builder.ToString(), new RK_URLReqeust.Callback(UploadPic_CallBack)); private void UploadPic_CallBack(string response) { Dispatcher.BeginInvoke(() => { MessageBox.Show(response); |
|
来自: xihayouyi > 《windowsphone7》