Windows Phone 7 网络编程之webclient和httpwebrequest的使用-阿里云开发者社区

开发者社区> 科技小能手> 正文

Windows Phone 7 网络编程之webclient和httpwebrequest的使用

简介:
+关注继续查看

一、WebClient类和HttpWebRequest 类
System.Net.WebClient 类
提供向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法。


WebClient 类提供向 URI(支持以 http:、https:、ftp:、和 file: 方案标识符开头的 URI) 标识的任何本地、Intranet 或 Internet 资源发送数据以及从这些资源接收数据的公共方法。

WebClient 类使用 WebRequest 类提供对资源的访问。WebClient 实例可以通过任何已向 WebRequest.RegisterPrefix 方法注册的 WebRequest 子代访问数据。

WebClient 类的方法、属性和事件


System.Net.HttpWebRequest 
提供 WebRequest 类的 HTTP 特定的实现。

HttpWebRequest 对 HTTP 协议进行了完整的封装,程序使用 HTTP 协议和服务器交互主要是进行数据的提交,通常数据的提交是通过 GET 和 POST 两种方式来完成。
HttpWebRequest常用命令如下:

  HttpWebRequest - 对指定的 URI 发出请求
  Create() - 初始化一个 WebRequest
  BeginGetResponse() - 开始对指定 URI 资源做异步请求
  EndGetResponse() - 结束对指定 URI 资源做异步请求
  HttpWebResponse - 对指定的 URI 做出响应
  GetResponseStream() - 获取响应的数据流 需要注意的是: HttpWebRequest使用基于代理的异步编程模型,在HTTP响应返回时引发的HttpWebRequest回调不是在UI线程上返回的,因此在该回调中需要额外代码处理UI,否则就会产生"跨线程访问无效"错误。

HttpWebRequest 类的方法、属性和事件

 

二、HttpWebRequest和WebClient的区别
1,HttpWebRequest是个抽象类,所以无法new的,需要调用HttpWebRequest.Create();
2,其Method指定了请求类型,这里用的GET,还有POST;也可以指定ConentType;
3,其请求的Uri必须是绝对地址;
4,其请求是异步回调方式的,从BeginGetResponse开始,并通过AsyncCallback指定回调方法;
5,WebClient方式使用基于事件的异步编程模型,在HTTP响应返回时引发的WebClient回调是在UI线程中调用的,因此可用于更新UI元素的属性,例如把HTTP响应中的数据绑定到UI的指定控件上进行显示。HttpWebRequest是基于后台进程运行的,回调不是UI线程,所以不能直接对UI进行操作,通常使用Dispatcher.BeginInvoke()跟界面进行通讯。

 

二、HttpWebRequest和WebClient在Windows Phone 7上的实例

获取网页的源代码

 

 

 


  1. <phone:PhoneApplicationPage   
  2.   x:Class="WebClientHttpWebRequest.MainPage" 
  3.   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  4.   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  5.   xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
  6.   xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
  7.   xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  8.   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  9.   mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
  10.   FontFamily="{StaticResource PhoneFontFamilyNormal}" 
  11.   FontSize="{StaticResource PhoneFontSizeNormal}" 
  12.   Foreground="{StaticResource PhoneForegroundBrush}" 
  13.   SupportedOrientations="Portrait" Orientation="Portrait" 
  14.   shell:SystemTray.IsVisible="True" Loaded="PhoneApplicationPage_Loaded"> 
  15.     <Grid x:Name="LayoutRoot" Background="Transparent"> 
  16.         <Grid.RowDefinitions> 
  17.             <RowDefinition Height="Auto"/> 
  18.             <RowDefinition Height="*"/> 
  19.         </Grid.RowDefinitions> 
  20.         <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 
  21.             <TextBlock x:Name="q" Text="加菲猫的博客" Style="{StaticResource PhoneTextNormalStyle}" Height="39" Width="444" />    
  22.         </StackPanel> 
  23.         <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
  24.             <TextBlock Height="38" HorizontalAlignment="Left" Margin="12,6,0,0" Name="webClientTextBlock" Text="TextBlock" VerticalAlignment="Top" Width="438" /> 
  25.             <TextBlock Height="44" HorizontalAlignment="Left" Margin="9,266,0,0" Name="httpWebRequestTextBlock" Text="TextBlock" VerticalAlignment="Top" Width="438" /> 
  26.             <TextBox Height="210" HorizontalAlignment="Left" Margin="9,50,0,0" Name="textBox1" Text="TextBox" VerticalAlignment="Top" Width="438" /> 
  27.             <TextBox Height="239" HorizontalAlignment="Left" Margin="12,316,0,0" Name="textBox2" Text="TextBox" VerticalAlignment="Top" Width="444" /> 
  28.         </Grid> 
  29.     </Grid> 
  30. </phone:PhoneApplicationPage> 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Windows;  
  6. using System.Windows.Controls;  
  7. using System.Windows.Documents;  
  8. using System.Windows.Input;  
  9. using System.Windows.Media;  
  10. using System.Windows.Media.Animation;  
  11. using System.Windows.Shapes;  
  12. using Microsoft.Phone.Controls;  
  13. using System.IO;  
  14.  
  15. namespace WebClientHttpWebRequest  
  16. {  
  17.     public partial class MainPage : PhoneApplicationPage  
  18.     {  
  19.         public MainPage()  
  20.         {  
  21.             InitializeComponent();  
  22.         }  
  23.         private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)  
  24.         {  
  25.             DoWebClient();  
  26.             DoHttpWebRequest();  
  27.         }  
  28.         private void DoWebClient()  
  29.         {  
  30.             WebClient webClient = new WebClient();  
  31.             webClient.OpenReadAsync(new Uri("http://www.cnblogs.com/linzheng"));//在不阻止调用线程的情况下,从资源返回数据  
  32.             webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);//异步操作完成时发生  
  33.         }  
  34.         void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)  
  35.         {  
  36.             using (StreamReader reader = new StreamReader(e.Result))  
  37.             {  
  38.                 string contents = reader.ReadToEnd();  
  39.                 int begin = contents.ToString().IndexOf("<title>");  
  40.                 int end = contents.ToString().IndexOf("</title>");  
  41.                 string note = contents.Substring(contents.ToString().IndexOf("摘要"), 300);  
  42.                 webClientTextBlock.Text = contents.ToString().Substring(begin+7, end - begin-7);  
  43.                 textBox1.Text = note;  
  44.             }  
  45.  
  46.         }  
  47.         private void DoHttpWebRequest()  
  48.         {  
  49.             string url = "http://www.cnblogs.com/linzheng";  
  50.             WebRequest request = HttpWebRequest.Create(url);//创建WebRequest类  
  51.             IAsyncResult result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request);//返回异步操作的状态  
  52.         }  
  53.         private void ResponseCallback(IAsyncResult result)  
  54.         {  
  55.             HttpWebRequest request = (HttpWebRequest)result.AsyncState;//获取异步操作返回的的信息  
  56.             WebResponse response = request.EndGetResponse(result);//结束对 Internet 资源的异步请求  
  57.  
  58.             using (Stream stream = response.GetResponseStream())  
  59.             using (StreamReader reader = new StreamReader(stream))  
  60.             {  
  61.                 string contents = reader.ReadToEnd();  
  62.                 int begin = contents.ToString().IndexOf("<title>");  
  63.                 int end = contents.ToString().IndexOf("</title>");  
  64.                 string note = contents.Substring(contents.ToString().IndexOf("摘要"), 300);  
  65.                 //通过呼叫UI Thread来改变页面的显示  
  66.                 Dispatcher.BeginInvoke(() => { httpWebRequestTextBlock.Text = contents.ToString().Substring(begin + 7, end - begin - 7); textBox2.Text = note; });  
  67.  
  68.             }  
  69.         }  
  70.     }  

 

本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1078703



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
iOS网络编程之四——请求类NSURLRequest使用详解
iOS网络编程之四——请求类NSURLRequest使用详解
18 0
ubuntu如何实现访问实际网络中windows共享文件夹
方法一: 首先在建立一个挂载目录。 sudo mkdir /mnt/share 然后就把共享目录持载进去。 服务器:192.168.6.84 共享名:gg 用户名:administrator 密 码:123 命令如下: sudo mount //192.168.6.84/gg /mnt/share/ -o iocharset=utf8,username=administrator,password=123,dmask=777,fmask=777,codepage=cp936,uid=0 加上iocharset=uf8与codepage=cp936。
6514 0
WebFlux基础之响应式编程
本篇介绍了WebFlux的必备知识--java中函数式编程与响应式编程的基本写法
1632 0
【Based Android】让你的android应用使用可爱的iphone备忘录字体
用过iphone的朋友一定会很记得ios系统自带的备忘录,里面的字体非常的可爱,所以大家有没有想过把这个字体弄到你的android设备中呢?                    其实android提供了非常方便的字体导入了方法了,这里不得不提到一个几乎快被大家遗忘了的一个文件夹assets.
599 0
《UNIX网络编程 卷2:进程间通信(第2版)》——1.9 小结
各种类型IPC的持续性可以是随进程持续的、随内核持续的或随文件系统持续的,这取决于IPC对象存在时间的长短。在为给定的应用选择所用的IPC类型时,我们必须清楚相应IPC对象的持续性。
1224 0
iOS6和iPhone5使用第三方静态库在真机无法运行的处理
环境: xcode5.1 ios7 在模拟器下正常运行的程序,在真机上出现下面的错误: ld: file is universal (3 slices) but does not contain a(n) armv7s slice: /Users/david/Downloads/QR code/QR code/ZBarSDK/libzbar.a for architecture armv7s 上面的提示是使用的libzbar这个库不支持armv7s。
751 0
23706
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载