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;