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端的工作就完成了,服务器端最后的目录如下:

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 = ;
image.Height = ;
image.Source = new BitmapImage(u);
image.Margin = new Thickness(,,,);
this.stackPanel1.Children.Add(image);
}
}

6,最后效果如下

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事件,不再详细列举。

转自:http://www.cnblogs.com/626498301/archive/2010/05/29/1746983.html

Windows Phone WebClient的使用的更多相关文章

  1. C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法。

    原文:C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法. 一般我们在撰写Windows Phone ...

  2. Windows Phone 8.1又有什么新花样

    今年微软新任CEO提出了“Mobile First and Cloud First”的发展战略,随着微软Mobile First战略的实行,开发者是时候重视Windows Phone了.你可能不相信, ...

  3. [.net 面向对象程序设计深入](5)MVC 6 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux)

    [.net 面向对象程序设计深入](5)MVC 6 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux) 1.关于跨平台 上篇中介绍了MVC的发展历程,说到ASP.NET ...

  4. 在Windows中安装NodeJS的正确姿势

    NodeJS已经非常流行了,而且可以预见他将继续受到追捧.这确实是一个不错的创举,想想看他现在能做什么吧 1.服务器程序(典型的就是用来做网站或者restful服务,主打就是多线程,非阻塞,最后,一个 ...

  5. Windows 搭建 .NET 跨平台环境并运行应用程序

    写在前面 阅读目录: Install .NET Version Manager (DNVM) Install .NET Core Execution Environment (DNX) Write t ...

  6. windows下React-native 环境搭建

    公司决定试水react-native,mac审批还没下来,没办法,先用windows硬着头皮上吧. 参考文章: React Native 中文网官方文档 史上最全Windows版本搭建安装React ...

  7. c# WebClient文件下载

    public void HttpDownload(string url, string path, ResourceType type) { using (var client = new WebCl ...

  8. [深入浅出WP8.1(Runtime)]Windows Phone 8.1和Silverlight 8.1的区别

    1.2.2 Windows Phone 8.1应用程序模型 Windows Phone 8.1支持多种开发语言来开发应用程序,包括C#.VB.JavaScript和C++,那么本书的代码主要是采用C# ...

  9. 【Windows】为节省系统资源,停掉不必要的服务

    1.windows服务名称(注册表名称)和显示名称对照表如下: < 显示名称 状态 服务名称 Application Management demand AppMgmt ASP.NET Stat ...

随机推荐

  1. LINQ操作符三:限制操作符

    where是限制操作符,它将过滤标准应用在序列上,按照提供的逻辑对序列中的数据进行过滤. where操作符不启动查询的执行.当开始对序列进行遍历时才开始执行,此时过滤条件将被应用到查询中. 示例: / ...

  2. C语言写的trim()函数

    C语言的标准库中缺少对字符串进行操作的trim()函数,使用起来有些不便,可以使用利用 strlen 和 isspace 函数以及指针来自己写一个. 1.strlen 函数 原型:extern int ...

  3. selenium测试(Java)--上传文件(十五)

    1. 当页面中是通过input标签实现上传功能时,可以使用selenium来上传功能. 如下: package com.test.upload; import java.io.File; import ...

  4. mac下普通用户无法创建crontab的问题解决

    想在mac下弄一个crontab定时任务,以为会像linux上那样顺利那,结果碰壁了,报错信息例如以下: ➜  autoshell  crontab -ecrontab: no crontab for ...

  5. LabVIEW中数组的自动索引

    我们在LabVIEW里面使用While或者是For循环结构的时候,就会发现每一个循环中在它们的循环结构的边界都可以自动完成一个数组元素的索引或累积.LabVIEW中循环结构的这种能力就叫做自动索引(A ...

  6. 【Java面试题】27 多线程笔试面试概念问答

    第一题:线程的基本概念.线程的基本状态及状态之间的关系? 线程,有时称为轻量级进程,是CPU使用的基本单元:它由线程ID.程序计数器.寄存器集合和堆栈组成.它与属于同一进程的其他线程共享其代码段.数据 ...

  7. mongodb group php 操作

    紧接着上篇来,这篇主要讲,mongodb的group功能,做的还是挺强大的,相当对于find(),skip(),distinct()等,用法比较复杂. 测试数据 > db.fruit.find( ...

  8. Java进阶路线图

    第一阶段 技术名称 技术内容 J2SE(Java基础部分) Java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置,程序的执行过程,相关反编译 ...

  9. oracle函数学习_根据用户id获取用户角色

    create or replace function FN_GET_ROLES(v_user_id varchar2) return varchar2 istype zy_emp_cursor is ...

  10. 工作流JBPM_day01:7-使用流程变量

    工作流JBPM_day01:7-使用流程变量 工作流就像流水线 对应数据库中的一张表 ProcessVariableTest.Java import java.util.List; import or ...