一 HttpWebReques
1,HttpWebRequest是個抽象類,所以無法new的,需要調用HttpWebRequest.Create();
2,其Method指定了請求類型,這里用的GET,還有POST;也可以指定ConentType;
3,其請求的Uri必須是絕對地址;
4,其請求是異步回調方式的,從BeginGetResponse開始,並通過AsyncCallback指定回調方法;
二 WebClient
1,WebClient 方式使用基於事件的異步編程模型,在HTTP響應返回時引發的WebClient回調是在UI線程中調用的,因此可用於更新UI元素的屬性,
例如把 HTTP響應中的數據綁定到UI的指定控件上進行顯示。HttpWebRequest是基於后台進程運行的,回調不是UI線程,所以不能直接對UI進行操作,通常使用Dispatcher.BeginInvoke()跟界面進行通訊。
1 //body是要傳遞的參數,格式"roleId=1&uid=2" 2 //post的cotentType填寫: 3 //"application/x-www-form-urlencoded" 4 //soap填寫:"text/xml; charset=utf-8" 5 public static string PostHttp(string url, string body, string contentType) 6 { 7 HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 8 9 httpWebRequest.ContentType = contentType; 10 httpWebRequest.Method = "POST"; 11 httpWebRequest.Timeout = 20000; 12 13 byte[] btBodys = Encoding.UTF8.GetBytes(body); 14 httpWebRequest.ContentLength = btBodys.Length; 15 httpWebRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length); 16 17 HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 18 StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream()); 19 string responseContent = streamReader.ReadToEnd(); 20 21 httpWebResponse.Close(); 22 streamReader.Close(); 23 httpWebRequest.Abort(); 24 httpWebResponse.Close(); 25 26 return responseContent; 27 } 28 29 POST方法(httpWebRequest)
1 /// <summary> 2 /// 通過WebClient類Post數據到遠程地址,需要Basic認證; 3 /// 調用端自己處理異常 4 /// </summary> 5 /// <param name="uri"></param> 6 /// <param name="paramStr">name=張三&age=20</param> 7 /// <param name="encoding">請先確認目標網頁的編碼方式</param> 8 /// <param name="username"></param> 9 /// <param name="password"></param> 10 /// <returns></returns> 11 public static string Request_WebClient(string uri, string paramStr, Encoding encoding, string username, string password) 12 { 13 if (encoding == null) 14 encoding = Encoding.UTF8; 15 16 string result = string.Empty; 17 18 WebClient wc = new WebClient(); 19 20 // 采取POST方式必須加的Header 21 wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 22 23 byte[] postData = encoding.GetBytes(paramStr); 24 25 if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)) 26 { 27 wc.Credentials = GetCredentialCache(uri, username, password); 28 wc.Headers.Add("Authorization", GetAuthorization(username, password)); 29 } 30 31 byte[] responseData = wc.UploadData(uri, "POST", postData); // 得到返回字符流 32 return encoding.GetString(responseData);// 解碼 33 } 34 35 POST方法(WebClient)
1 public static string GetHttp(string url, HttpContext httpContext) 2 { 3 string queryString = "?"; 4 5 foreach (string key in httpContext.Request.QueryString.AllKeys) 6 { 7 queryString += key + "=" + httpContext.Request.QueryString[key] + "&"; 8 } 9 10 queryString = queryString.Substring(0, queryString.Length - 1); 11 12 HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url + queryString); 13 14 httpWebRequest.ContentType = "application/json"; 15 httpWebRequest.Method = "GET"; 16 httpWebRequest.Timeout = 20000; 17 18 //byte[] btBodys = Encoding.UTF8.GetBytes(body); 19 //httpWebRequest.ContentLength = btBodys.Length; 20 //httpWebRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length); 21 22 HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 23 StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream()); 24 string responseContent = streamReader.ReadToEnd(); 25 26 httpWebResponse.Close(); 27 streamReader.Close(); 28 29 return responseContent; 30 } 31 32 Get方法(HttpWebRequest)
1 /// <summary> 2 /// 通過 WebRequest/WebResponse 類訪問遠程地址並返回結果,需要Basic認證; 3 /// 調用端自己處理異常 4 /// </summary> 5 /// <param name="uri"></param> 6 /// <param name="timeout">訪問超時時間,單位毫秒;如果不設置超時時間,傳入0</param> 7 /// <param name="encoding">如果不知道具體的編碼,傳入null</param> 8 /// <param name="username"></param> 9 /// <param name="password"></param> 10 /// <returns></returns> 11 public static string Request_WebRequest(string uri, int timeout, Encoding encoding, string username, string password) 12 { 13 string result = string.Empty; 14 15 WebRequest request = WebRequest.Create(new Uri(uri)); 16 17 if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)) 18 { 19 request.Credentials = GetCredentialCache(uri, username, password); 20 request.Headers.Add("Authorization", GetAuthorization(username, password)); 21 } 22 23 if (timeout > 0) 24 request.Timeout = timeout; 25 26 WebResponse response = request.GetResponse(); 27 Stream stream = response.GetResponseStream(); 28 StreamReader sr = encoding == null ? new StreamReader(stream) : new StreamReader(stream, encoding); 29 30 result = sr.ReadToEnd(); 31 32 sr.Close(); 33 stream.Close(); 34 35 return result; 36 } 37 38 #region # 生成 Http Basic 訪問憑證 # 39 40 private static CredentialCache GetCredentialCache(string uri, string username, string password) 41 { 42 string authorization = string.Format("{0}:{1}", username, password); 43 44 CredentialCache credCache = new CredentialCache(); 45 credCache.Add(new Uri(uri), "Basic", new NetworkCredential(username, password)); 46 47 return credCache; 48 } 49 50 private static string GetAuthorization(string username, string password) 51 { 52 string authorization = string.Format("{0}:{1}", username, password); 53 54 return "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(authorization)); 55 } 56 57 #endregion 58 59 basic驗證的WebRequest/WebResponse
