1、WebClient類
如果只是想從特定的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()方法把作為字節數組提供的二進制數據上傳至指定的URI
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類使用簡單,但是功能有限,尤其是不能提供身份驗證證書,導致很多站點不接受這樣的上傳文件。
2、WebRequest類和WebResponse類
WebRequest類代表要給某個特定URI發送信息的請求,URI作為參數傳遞給Create()方法。WebResponse類代表從服務器檢索的數據。調用WebRequest.GetResponse()方法,實際上是把請求發送給Web服務器,並創建一個Response對象,以檢查返回的數據。與WebClient對象一樣,可以得到一個代表數據的數據流。但是這里的數據流使用WebResponse.GetResponseStream()方法獲得。
介紹一個例子使用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();
3、把輸出結果顯示為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();
- 從應用程序中進行簡單的Web瀏覽
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)13) { webBrowser1.Navigate(textBox1.Text); } }
上述代碼為TextBox控件按下回車鍵的代碼。
- 啟動Internet Explorer實例
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)。
- 給應用程序提供更多IE類型的功能
在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(); }
//后續還有一個簡答的瀏覽器實例,時間來不及了,明天記錄下來。