WebClient与WebRequest差异
WebRequst的使用
WebClient和HttpWebRequst是用来获取数据的2种方式,在我的这篇数据访问(2)中主要是讲的WebClient的使用,一般而言,WebClient更倾向于“按需下载”,事实上掌握它也是相对容易的,而HttpWebRequst则允许你设置请求头或者对内容需要更多的控制,后者有点类似于form中的submit。虽然两者都是异步请求事件,但是WebClient是基于事件的异步,而HttpWebRequst是基于代理的异步编程,下面就用简单的需求两者比较用法上的不同:
需求很简单,获取Web端的图片然后显示出来,结构如右边所示
UI很简单:
<StackPanel Background="White">
<Button Width="250"
Content="HttpWebRequest"
Click="Button_Click" />
<Button Width="250"
Content="Click for request with WebClient"
Click="Button_Click_1" />
<TextBox Text="1"
x:Name="numTextBox"
Width="20" />
<Image Height="150"
Name="image1"
Stretch="Fill"
Width="200" />
</StackPanel>
页面上提供一个TextBox用来输入文件名的,先看一看WebClient获取图片并显示在Image的过程
//使用WebClient
private void Button_Click_1(object sender, RoutedEventArgs e)
{
string baseUri = String.Format("http://localhost:49280/Images/{0}.jpg", this.numTextBox.Text.Trim());
Uri uri = new Uri(baseUri, UriKind.Absolute);
WebClient client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
}
void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
Stream stream = e.Result;
BitmapImage bitmap = new BitmapImage();
bitmap.SetSource(stream);
this.image1.Source = bitmap;
}
因为之前已经对WebClient总结过了,所以就不再重复了,主要是看一看WebRequst如果要实现相同的代码的过程
//使用WebRequest
private void Button_Click(object sender, RoutedEventArgs e)
{
string baseUri =String.Format("http://localhost:49280/Images/{0}.jpg",this.numTextBox.Text.Trim());
HttpWebRequest request =(HttpWebRequest) WebRequest.Create(baseUri);
request.Method = "GET";
request.BeginGetResponse(new AsyncCallback(ReadCallback), request);
}
public void ReadCallback(IAsyncResult asyc)
{
HttpWebRequest request = (HttpWebRequest)asyc.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyc);
this.Dispatcher.BeginInvoke(() =>
{
Stream stream = response.GetResponseStream();
BitmapImage bitmap = new BitmapImage();
bitmap.SetSource(stream);
this.image1.Source = bitmap;
}
);
}
几点需要注意的地方: 1,HttpWebRequest是个抽象类,所以无法new的,需要调用HttpWebRequest.Create();
2,其Method指定了请求类型,这里用的GET,还有POST;也可以指定ConentType;
3,其请求的Uri必须是绝对地址;
4,其请求是异步回调方式的,从BeginGetResponse开始,并通过AsyncCallback指定回调方法;
5,因为其回调不是UI线程,所以不能直接对UI进行操作,这里使用Dispatcher.BeginInvoke()
主要是第4点,如果把上面的代码中回调方法改成这样下面的样子的话,VS会提示跨域线程访问无效
HttpWebRequest request = (HttpWebRequest)asyc.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyc);
Stream stream=response.GetResponseStream();
BitmapImage bitmap = new BitmapImage();
bitmap.SetSource(stream);
this.image1.Source = bitmap;