最近在爲公司產品(ASP.NET B/S結構)進行升級的時候遇到了客戶的這樣一個需求.
系統提供會議投票這樣一種功能,在會議參與者對此次會議所要研究的合同進行研討之後,系統把參與者的意見(同意,不同意,有條件同意)和意見的詳細信息列出,供會議決策者參考,最後由會議決策者輸入決策意見.
其中每一筆合同都包括很多信息,如:法人資料,兄弟公司信息,擔保人信息等等,用戶迫切需要保存這一系列信息的當前狀態.因爲這些信息在未來的系統使用過程中可能會發生變更,比如擔保人的名稱變更等等.
但是所有的這些信息是由不同的功能結合起來組成的,如果想把這些信息進行彙總,那麼重寫所有的信息獲取方法是不太可行的,所以直接請求頁面,從服務器返回的HTML數據流中獲取所需內容也許是一個可行的辦法.
首先在程序中維持一個所有信息請求頁面地址的列表,然後循環這個列表,進行信息的獲取.
在程序中用到了System.Net, System.IO命名空間.
public string getPageFromURL(string url)
{
string content = "";
// Create a new HttpWebRequest object.Make sure that
// a default proxy is set if you are behind a fure wall.
//其中,HttpWebRequest實例不使用HttpWebRequest的構造函數來創建,二是使用WebRequest的Create方法來創建.
HttpWebRequest myHttpWebRequest1 = (HttpWebRequest)WebRequest.Create(url);
//不維持與服務器的請求狀態
myHttpWebRequest1.KeepAlive = false;
//創建一個HttpWebRequest對象
//Assign the response object of HttpWebRequest to a HttpWebResponse variable./
HttpWebResponse myHttpWebResponse1;
try
{
//根據微軟MSDN上所說:"決不要直接創建HttpWebResponse的實例,要使用HttpWebRequest的GetResponse()方法返回的實例."具體的原因我也不清楚,可能HttpWebResponse類的構造函數中沒有實現HttpWebResponse實例的代碼吧.
myHttpWebResponse1 = (HttpWebResponse)myHttpWebRequest1.GetResponse();
//設置頁面的編碼模式
System.Text.Encoding utf8 = System.Text.Encoding.Default;
Stream streamResponse = myHttpWebResponse1.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse, utf8);
Char[] readBuff = new Char[256];
//這裏使用了StreamReader的Read()方法,參數意指從0開始讀取256個char到readByff中.
//Read()方法返回值爲指定的字符串數組,當達到文件或流的末尾使,方法返回0
int count = streamRead.Read(readBuff, 0, 256);
while (count > 0)
{
String outputData = new String(readBuff, 0, count);
content += outputData;
count = streamRead.Read(readBuff, 0, 256);
}
myHttpWebResponse1.Close();
return (content);
}
catch (WebException ex)
{
content = "在請求URL爲:" + url + "的頁面時產生錯誤,錯誤信息爲" + ex.ToString();
return (content);
}
}