热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> Silverlight>>正文内容

Silverlight中的数据访问2

发布时间:2010年08月13日点击数: 佚名

WebClient的使用

        webClient对象可用来下载XML文件,程序集等这些数据,其可以实现按需下载,所以还是有必要了解的。其主要包含几个事件:            

                                        DownloadProcessChanged DownloadStringCompleted
                                               OpenReadCompleted OpenWriteCompleted
                                            UploadProcessChanged UploadStringCompletedDownload

那么需要注意的是,这些事件是针对不同类型的数据设计的,比如说若资源是txt,xml这些数据文件,可以使用DownloadStringAsync发送请求,然后处理DownloadStringCompleted事件,如果资源是视屏,压缩包这种Stream形式的数据,则可以使用OpenReadAsync发送请求,然后处理OpenReadCompleted事件,下面以这两种情况各取一个例子。

  DownloadStringAsync的使用

        首先需要注意的是,使用WebCilent发送下载请求,每次都只能发送一次,如果第一次发送的请求还未获得返回数据时,再次向服务器发送第二个请求,这时候WebClient的对象属性IsBusy为真,这时会出现NotSupportedException

   那么下面的例子以实现下载服务器端的图片为例:

1, 图片放在Web端的文件夹中

2,建立一个xml文件,存储图片的信息

     格式如下:

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <images> 
  3. <image uri="Images/2.jpg">     
  4. </image> 
  5. <image uri="Images/3.jpg"> 
  6. </image> 
  7. </images> 

 

3,Web端的工作就完成了,服务器端最后的目录如下:

1

 

4,在客户端的页面做下简单的设置,添加一个按钮与一个StackPanel控件即可

5,在按钮的Button的单击事件中添加处理程序,这里不要忘了添加Linq To xml的dll,最后详细后台代码如下:

  1.  private void button1_Click(object sender, RoutedEventArgs e) 
  2.  { 
  3.      Uri uri = new Uri(HtmlPage.Document.DocumentUri,"Images.xml"); 
  4.      WebClient client = new WebClient(); 
  5.      client.DownloadStringCompleted+=new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); 
  6.      client.DownloadStringAsync(uri); 
  7.  } 
  8.  private void  client_DownloadStringCompleted(object sender,DownloadStringCompletedEventArgs e) 
  9.      //使用Linq To XML处理数据 
  10.        XmlReader reader=XmlReader.Create(new StringReader(e.Result)); 
  11.      XDocument doc = XDocument.Load(reader); 
  12.      var list = (from image in doc.Descendants("image"
  13.                 select new Uri(HtmlPage.Document.DocumentUri, image.Attribute("uri").Value)).ToList(); 
  14.      foreach (var u in list) 
  15.      { 
  16.          //动态加载 
  17.          Image image = new Image(); 
  18.          image.Width = 50; 
  19.          image.Height = 50; 
  20.          image.Source = new BitmapImage(u); 
  21.          image.Margin = new Thickness(10,10,10,10); 
  22.          this.stackPanel1.Children.Add(image); 
  23.      } 

 

6,最后效果如下

2

OpenReadAsync的使用

         区别前面已经说到了,使用OpenReadAsync得到的是一个Stream形式的数据,我们在刚才的例子基础上进行小小的更改修改,

把存放照片的文件夹改为压缩包,客户端后台代码再做点变动即可。

  1. private void button2_Click(object sender, RoutedEventArgs e) 
  2.     Uri uri = new Uri(HtmlPage.Document.DocumentUri, "Images.zip"); 
  3.     WebClient client = new WebClient(); 
  4.     client.OpenReadAsync(uri); 
  5.     client.OpenReadCompleted+=new OpenReadCompletedEventHandler(client_OpenReadCompleted); 
  6. ublic void client_OpenReadCompleted(object sender,OpenReadCompletedEventArgs e) 
  7.     Stream stream = e.Result; 
  8.    //从压缩数据流获取一个图片 
  9.     Uri uri = new Uri("2.jpg",UriKind.Relative); 
  10.     StreamResourceInfo zip = new StreamResourceInfo(stream,null); 
  11.     StreamResourceInfo img = Application.GetResourceStream(zip,uri); 
  12.     //数据流转化为图片 
  13.     BitmapImage bits = new BitmapImage(); 
  14.     bits.SetSource(img.Stream); 
  15.     Image image = new Image(); 
  16.     image.Source = bits; 
  17.      
  18.    this.stackPanel1.Children.Add(image); 

需要注意的就是这个例子中文件的格式是zip的,改为rar的是无法通过的。

UploadStringAsync的使用

  上传字符串形式的数据,使用UploadStringAsync,这里说明一个简单的示例,将用户输入的数据显示出来
1,首先创建一个名为MyHandler.ashx的HttpHandler类,添加简单的几行代码:

  1. public void ProcessRequest(HttpContext context) 
  2.  
  3.    int length = context.Request.ContentLength; 
  4.    byte [] bytes=context.Request.BinaryRead(length); 
  5.    string msg = System.Text.Encoding.Default.GetString(bytes); 
  6.    context.Response.ContentType = "text/plain"
  7.    context.Response.Write(msg); 

2,在客户端的界面上加上一个TextBox即可,客户端后台代码:

  1. private void button3_Click(object sender, RoutedEventArgs e) 
  2.     string msg = this.textBox1.Text.ToString(); 
  3.     Uri uri = new Uri("http://localhost:50894/MyHandler.ashx"); 
  4.     WebClient client = new WebClient(); 
  5.     client.UploadStringCompleted+=new UploadStringCompletedEventHandler(client_UploadStringCompleted); 
  6.     client.UploadStringAsync(uri,"Post",msg); 
  7. public void  client_UploadStringCompleted(object sender,UploadStringCompletedEventArgs e) 
  8.  { 
  9.      string msg = e.Result; 
  10.      MessageBox.Show(msg); 
  11.  } 

可以看出对WebClient的使用就是关键的几步,关键在于对于数据处理的部分,最后页面的效果就不展示了。这里若需要实现流形式的数据写入到指定资源,只需调用OpenWriteAsync与OpenWriteCompleted事件,不再详细列举。

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作