1.WebRequest和WebResponse
首先新建windows窗体应用程序,添加列表框,并将其docking属性设置为“DockStyle.Fill”,然后对主窗体的构造函数进行如下改动。
public Form1()
{
InitializeComponent();
WebRequest request = WebRequest.Create("http://www.baidu.com");
WebResponse response = request.GetResponse();
Stream strm = response.GetResponseStream();
StreamReader sr = new StreamReader(strm);
string line;
while ((line = sr.ReadLine()) != null)
listBox1.Items.Add(line);
strm.Close();
}
WebRequest发送请求,WebResponse接受从服务器返回的数据。初始化WebRequest时调用静态函数Create(),并将地址作为参数。 通过函数GetResponse获取服务器对请求的响应。通过函数GetResponseStream()获取服务器返回的数据流。
运行结果
2. HttpWebRequest和HttpWebResponse
HttpWebRequest 和 HttpWebResponse分别是WebRequest、WebResponse的派生类,用以处理HTTP URL创建的请求及响应。这两个类可以访问HTTP协议的特定属性。
public Form1()
{
InitializeComponent();
WebRequest request = WebRequest.Create("http://www.baidu.com");
HttpWebRequest httpRequest = (HttpWebRequest)request;
listBox1.Items.Add("Tiemout = " + httpRequest.Timeout);
listBox1.Items.Add("Keep Alive = " + httpRequest.KeepAlive);
listBox1.Items.Add("AllowAutoRedirect = " + httpRequest.AllowAutoRedirect);
}
Timeout属性表示超时时间(默认为100000ms),属性KeepAlive表示是否保持连接(默认为True),属性AllowAutoRedirect表示请求是否跟随Web服务器的重定向响应(默认为True)。
运行结果
请求类和响应类以属性的形式提供了很多重要的信息,也可以通过Header提取信息。
public Form1()
{
InitializeComponent();
WebRequest request = WebRequest.Create("http://www.baidu.com");
HttpWebRequest httpRequest = (HttpWebRequest)request;
WebResponse response = request.GetResponse();
WebHeaderCollection webHeader = response.Headers;
for (int i = 0; i < webHeader.Count; i++)
{
listBox1.Items.Add(string.Format("Header {0}:: {1}", webHeader.GetKey(i), webHeader[i]));
}
}
运行结果
3.异步请求
向服务器发送请求到接收到服务器响应之间会有延迟,如果不希望程序处于等待状态,就应该使用异步方法。
函数BeginGetResponse()异步工作,并立即返回。在底层,运行库会异步管理一个后台线程,以从服务器上接收响应。
回调函数OnResponse的返回类型是void,参数是IAsyncResult。当后台线程收到响应后,就执行该回调函数。回调函数中可以使用EndGetResponse获取WebResponse对象。
public partial class Form1 : Form
{
protected static void OnResponse(IAsyncResult ar)
{
WebRequest request = (WebRequest)ar.AsyncState;
WebResponse response = request.EndGetResponse(ar);
// read response
}
public Form1()
{
InitializeComponent();
WebRequest request = WebRequest.Create("http://www.baidu.com");
request.BeginGetResponse(new AsyncCallback(OnResponse),request);
}
}