zoukankan      html  css  js  c++  java
  • Silverlight中的数据访问2

    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文件,存储图片的信息

         格式如下:

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

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

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

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

           private void button1_Click(object sender, RoutedEventArgs e)
    
            {
    
                Uri uri = new Uri(HtmlPage.Document.DocumentUri,"Images.xml");
    
                WebClient client = new WebClient();
    
                client.DownloadStringCompleted+=new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
    
                client.DownloadStringAsync(uri);
    
            }
    
            private void  client_DownloadStringCompleted(object sender,DownloadStringCompletedEventArgs e)
    
           {
    
                //使用Linq To XML处理数据
    
                  XmlReader reader=XmlReader.Create(new StringReader(e.Result));
    
                XDocument doc = XDocument.Load(reader);
    
                var list = (from image in doc.Descendants("image")
    
                           select new Uri(HtmlPage.Document.DocumentUri, image.Attribute("uri").Value)).ToList();
    
                foreach (var u in list)
    
                {
    
                    //动态加载
    
                    Image image = new Image();
    
                    image.Width = 50;
    
                    image.Height = 50;
    
                    image.Source = new BitmapImage(u);
    
                    image.Margin = new Thickness(10,10,10,10);
    
                    this.stackPanel1.Children.Add(image);
    
                }
    
           }

    6,最后效果如下2

    OpenReadAsync的使用

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

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

            private void button2_Click(object sender, RoutedEventArgs e)
    
            {
    
                Uri uri = new Uri(HtmlPage.Document.DocumentUri, "Images.zip");
    
                WebClient client = new WebClient();
    
                client.OpenReadAsync(uri);
    
                client.OpenReadCompleted+=new OpenReadCompletedEventHandler(client_OpenReadCompleted);
    
            }
    
           public void client_OpenReadCompleted(object sender,OpenReadCompletedEventArgs e)
    
            {
    
                Stream stream = e.Result;
    
               //从压缩数据流获取一个图片
    
                Uri uri = new Uri("2.jpg",UriKind.Relative);
    
                StreamResourceInfo zip = new StreamResourceInfo(stream,null);
    
                StreamResourceInfo img = Application.GetResourceStream(zip,uri);
    
                //数据流转化为图片
    
                BitmapImage bits = new BitmapImage();
    
                bits.SetSource(img.Stream);
    
                Image image = new Image();
    
                image.Source = bits;
    
                
    
               this.stackPanel1.Children.Add(image);
    
            }

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

    UploadStringAsync的使用

      上传字符串形式的数据,使用UploadStringAsync,这里说明一个简单的示例,将用户输入的数据显示出来

    1,首先创建一个名为MyHandler.ashx的HttpHandler类,添加简单的几行代码:

             public void ProcessRequest(HttpContext context)
    
            {
    
                int length = context.Request.ContentLength;
    
                byte [] bytes=context.Request.BinaryRead(length);
    
                string msg = System.Text.Encoding.Default.GetString(bytes);
    
                context.Response.ContentType = "text/plain";
    
                context.Response.Write(msg);
    
            }

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

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

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

  • 相关阅读:
    定时任务,执行时间动态配置方式
    MultipartFile+nio上传文件
    org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundaryRAYPKeHKTYSNdzc1;charset=UTF-8' not supported
    JDBC 连Sql Server 接数据库--The TCP/IP connection to the host localhost, port 1433 has failed
    swagger2常用注解说明
    java zxing实现二维码生成和解析zxing实现二维码生成和解析
    【springboot+easypoi】一行代码搞定excel导入导出
    linux中set、unset、export、env、declare,readonly的区别以及用法
    Spring---七大核心模块
    【Tomcat】Tomcat容器 web.xml详解
  • 原文地址:https://www.cnblogs.com/626498301/p/1746983.html
Copyright © 2011-2022 走看看