一、WebClient類web
若是隻是想從特定的URI(統一資源標識符)請求文件,則可使用最簡單的.NET類,System.Net.WebClient。支持http:、https:和file:標識符開頭的URI。URL統一資源定位符。編程
WebClient client =new WebClient(); client.DownloadFile("http://www.reuters.com/","ReutersHomepage.htm");
~更常見的是,應用程序須要處理從web站點檢索到的數據,爲此要使用OpenRead()方法,該方法返回一個Stream引用。而後就能夠把數據從數據流中提取到內存中:數組
WebClient client = new WebClient(); Stream strm = client.OpenRead("http://www.baidu.com"); StreamReader sr = new StreamReader(strm); string line; while ((line = sr.ReadLine()) != null) { listBox1.Items.Add(line); } strm.Close(); sr.Close();
WebClient類還有一個OpenWrite()方法,它能夠返回一個可寫的數據流,便於用戶把數據發送給URI。也能夠指定用於把數據發送給主機的方法;默認的方法是POST。下面的代碼假定在本地計算機上有一個可寫的目錄accept,這段代碼在該目錄下建立newfile.txt文件:瀏覽器
WebClient webClient=new WebClient(); Stream stream=webClient.OpenWrite(「http://localhost/accept/newfile.txt」,」PUT」) StreamWriter streamWriter=new StreamWriter(stream); streamWriter.WriteLine(「Hello World」); streamWriter.Close();
WebClient類提供UploadFile()和UploadData()方法。安全
UploadFile()方法將文件上傳到指定位置,其中文件名已經給出;服務器
UploadData()方法把做爲字節數組提供的二進制數據上傳至指定的URIcookie
WebClient client = new WebClient(); client.UploadFile("http://www.baidu.com/NewFile.htm", "C:\\WebSiteFIles\\NewFIle.htm"); byte[] image; client.UploadData("http://www.ourwebsite.com/NewFile.jpg", image);
WebClient類使用簡單,可是功能有限,尤爲是不能提供身份驗證證書,致使不少站點不接受這樣的上傳文件。網絡
二、WebRequest類和WebResponse類函數
WebRequest類表明要給某個特定URI發送信息的請求,URI做爲參數傳遞給Create()方法。WebResponse類表明從服務器檢索的數據。調用WebRequest.GetResponse()方法,其實是把請求發送給Web服務器,並建立一個Response對象,以檢查返回的數據。與WebClient對象同樣,能夠獲得一個表明數據的數據流。可是這裏的數據流使用WebResponse.GetResponseStream()方法得到。this
介紹一個例子使用WebRequest和WebResponse類,用來下載Web頁面。
WebRequest wrq = WebRequest.Create("http://www.reuters.com"); WebResponse wrs = wrq.GetResponse(); Stream strm = wrs.GetResponseStream(); StreamReader sr = new StreamReader(strm); string line; while ((line = sr.ReadLine()) != null) { listBox1.Items.Add(line); } sr.Close(); strm.Close();
在這個例子中,首先對錶明Web請求的對象進行實例化,但再次沒有使用構造函數,而是調用靜態的WebRequest.Create()方法。WebRequest類是支持不一樣網絡協議的類的層次結構 的一部分,爲了給請求類型接收一個正確對象的引用,須要一個工廠機制。WebRequest.Create()方法會爲給定的協議建立合適的對象。
Http協議的一個重要方面就是可以利用請求數據流和響應數據流發送擴展的標題信息。標題信息能夠包括cookie以及發送請求的特定瀏覽器(用戶代理)的詳細信息。WebRequest類和WebResponse類提供了讀取標題信息的一些支持。而兩個派生的類HttpWebRequest和HttpWebResponse提供了其餘HTTP特定的信息。
用HTTP URI建立WebRequest會生成一個HttpWebRequest對象實例。由於HttpWebRequest對象實例派生自WebRequest類,因此能夠在須要WebRequest類的任何地方使用新實例。
在GetResponse()方法調用以前添加以下代碼,能夠檢查兩個標題屬性的某些內容:
HttpWebRequest hwrq = (HttpWebRequest)wrq; listBox1.Items.Add("Request Timeout (ms) =" + wrq.Timeout); listBox1.Items.Add("Request Keep Alive = " + hwrq.KeepAlive); listBox1.Items.Add("Request AllowAutoRedirect = " + hwrq.AllowAutoRedirect);
AllowAutoRedirect屬性專用於HttpWebRequest類,使用這個屬性能夠控制Web請求是否應自動跟隨Web服務器上的重定向響應。默認值爲true。若是隻容許有限次數的重定向,就能夠把HttpWebRequest類的MaximumAutomaticRedirections屬性設置爲指望的數值。
請求類和相應類以屬性的形式提供大多數重要的標題,也可使用Headers屬性自己顯示標題的整個集合。在GetResponse()方法調用的後面添加以下代碼,能夠把全部標題放在列表框控件中:
WebHeaderCollection whc = wrs.Headers; for (int i = 0; i < whc.Count; i++) { listBox1.Items.Add(string.Format("Header {0}:{1}", whc.GetKey(i), whc[i])); }
身份驗證
WebRequest類中的另外一個屬性是Credentials屬性,若是把須要身份驗證證書附帶在請求中,就能夠用用戶名和密碼建立NetWorkCredential類的一個實例。在調用GetResponse()方法以前,添加以下代碼:
NetworkCredential myCred = new NetworkCredential("myusername", "mypassword"); wrq.Credentials = myCred;
使用代理
公司若是使用代理服務器進行全部類型的HTTP或FTP請求,代理服務器經常使用某種形式的安全性,一般是用戶名和密碼,路由公司的全部請求和響應。對於使用WebClient對象或者WebRequest對象的應用程序,須要考慮這些代理服務器。與前面的NetworkCredential對象同樣,在進行調用以執行實際請求以前,須要使用WebProxy對象。
WebProxy wp = new WebProxy("192.168.1.100", true); wp.Credentials = new NetworkCredential("user1", "user1Password"); WebRequest wrq = WebRequest.Create("http://www.baidu.com"); wrq.Proxy = wp; WebResponse wrs = wrq.GetResponse();
三、把輸出結果顯示爲HTML頁面
以前介紹的下載文件都是純文本顯示的。
COM,Component Object Model,組件對象模型。
WebBrowser控件封裝了COM對象,能夠更方便完成任務。除了使用WebBrowser控件以外,另外一個選項是使用編程功能,從代碼中調用Internet Explorer實例。
還可使用System.Diagnostics名稱空間中的Process類,經過編程打開Internet Explorer進程,導航到給定的Web頁。
Process myProcess = new Process(); myProcess.StartInfo.FileName = "iexplore.exe"; myProcess.StartInfo.Arguments = "http://www.baidu.com"; myProcess.Start();
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)13) { webBrowser1.Navigate(textBox1.Text); } }
上述代碼爲TextBox控件按下回車鍵的代碼。
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { WebBrowser wb = new WebBrowser(); wb.Navigate("http://www.baidu.com", true); }
用戶單擊LinkLabel控件時,就會新建WebBrowser類的一個實例。而後使用WebBrowser類的Navigate() 方法,代碼指定了Web頁面的位置和一個布爾值,該布爾值表示在Windows窗體應用程序內部打開這個端點(false),仍是從一個單獨的瀏覽器中打開這個端點(true)。
在1的例子中,單擊WebBrowser控件中的連接,TextBox控件中的文本不會更新,所以不能顯示瀏覽過程的準確位置的URL。若是使用HTML頁面的標題更新窗體的標題,應偵聽WebBrowser控件中的事件,給控件添加處理程序。
private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) { this.Text = webBrowser1.DocumentTitle.ToString(); }
若是須要根據所查看頁面的完整URL改變窗體的文本框,
private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) { textBox1.Text = webBrowser1.Url.ToString(); this.Text = webBrowser1.DocumentTitle.ToString(); }
//後續還有一個簡答的瀏覽器實例,時間來不及了,明天記錄下來。