C#的HttpWebRequest编程,支持带ViewState的网页POST请求

从网上找到了Jake LinJake's Blog on 博客园)的一篇文章《.NET Compact Framework下HttpWebRequest开发》,在他的代码基础上稍加修改,可以编程模拟网页POST提交的效果。

在主程序上用了个循环,再将取出的网页用正则表达式把想要的信息取出来,最后成功地提取出了石油大学附中2010小升初的成绩表。

static private string SearchURL(string id)

{

try

{

//Get the ViewState and EventValidation

HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;

request.Method = "GET";

request.KeepAlive = false;

//Get the response

HttpWebResponse response = request.GetResponse() as HttpWebResponse;

System.IO.Stream responseStream = response.GetResponseStream();

System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);

string srcString = reader.ReadToEnd();

//Get the ViewState

string viewStateFlag = "__VIEWSTATE\" value=\"";

int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;

int j = srcString.IndexOf("\"", i);

string viewState = srcString.Substring(i, j - i);

//Get the ViewState

string EventValidationFlag = "__EVENTVALIDATION\" value=\"";

i = srcString.IndexOf(EventValidationFlag) + EventValidationFlag.Length;

j = srcString.IndexOf("\"", i);

string eventValidation = srcString.Substring(i, j - i);

//Compose the URL

viewState = Uri.EscapeDataString(viewState);

eventValidation = Uri.EscapeDataString(eventValidation);

string strSearch = Uri.EscapeDataString("查询");

string formatString = "__VIEWSTATE={0}&__EVENTVALIDATION={1}&TextBox1={2}&Button1={3}";

string postString = string.Format(formatString, viewState, eventValidation, id,strSearch);

//Change to byte[]

byte[] postData = Encoding.ASCII.GetBytes(postString);

//Compose the new request

request = WebRequest.Create(URI) as HttpWebRequest;

request.Method = "POST";

request.KeepAlive = false;

request.ContentType = "application/x-www-form-urlencoded";

request.ContentLength = postData.Length;

System.IO.Stream outputStream = request.GetRequestStream();

outputStream.Write(postData, 0, postData.Length);

outputStream.Close();

//Get the new response

response = request.GetResponse() as HttpWebResponse;

responseStream = response.GetResponseStream();

reader = new System.IO.StreamReader(responseStream);

srcString = reader.ReadToEnd();

return srcString;

}

catch (WebException we)

{

Console.WriteLine("Communication error," + we.Message + " please check your connectivity and try again.", "Error");

}

catch

{

Console.WriteLine("Unknow error.", "Error");

}

return null;

}