上接稳扎稳打Silverlight(20) - 2.0通信之WebClient, 以字符串的形式上传/下载数据
REST.cs(WCF创建的用于演示以字符串的形式和流的形式上传数据的REST服务)
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Collections.Generic;
using System.Text;
using System.IO;
/// <summary>
/// 提供 REST 服务的类
/// 注:Silverlight只支持 GET 和 POST
/// </summary>
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class REST
{
/// <summary>
/// 用于演示返回 JSON(对象) 的 REST 服务
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[OperationContract]
[WebGet(UriTemplate = "User/{name}/json", ResponseFormat = WebMessageFormat.Json)]
public User HelloJson(string name)
{
return new User { Name = name, DayOfBirth = new DateTime(1980, 2, 14) };
}
/// <summary>
/// 用于演示返回 JSON(集合) 的 REST 服务
/// </summary>
/// <returns></returns>
[OperationContract]
[WebGet(UriTemplate = "Users/json", ResponseFormat = WebMessageFormat.Json)]
public List<User> HelloJson2()
{
return new List<User>
{
new User(){ Name = "webabcd01", DayOfBirth = new DateTime(1980, 1, 1) },
new User(){ Name = "webabcd02", DayOfBirth = new DateTime(1980, 2, 2) },
new User(){ Name = "webabcd03", DayOfBirth = new DateTime(1980, 3, 3) },
};
}
/// <summary>
/// 用于演示返回 XML(对象) 的 REST 服务
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[OperationContract]
[WebGet(UriTemplate = "User/{name}/xml", ResponseFormat = WebMessageFormat.Xml)]
public User HelloXml(string name)
{
return new User { Name = name, DayOfBirth = new DateTime(1980, 2, 14) };
}
/// <summary>
/// 用于演示返回 XML(集合) 的 REST 服务
/// </summary>
/// <returns></returns>
[OperationContract]
[WebGet(UriTemplate = "Users/xml", ResponseFormat = WebMessageFormat.Xml)]
public List<User> HelloXml2()
{
return new List<User>
{
new User(){ Name = "webabcd01", DayOfBirth = new DateTime(1980, 1, 1) },
new User(){ Name = "webabcd02", DayOfBirth = new DateTime(1980, 2, 2) },
new User(){ Name = "webabcd03", DayOfBirth = new DateTime(1980, 3, 3) },
};
}
/// <summary>
/// 用于演示以字符串的形式上传数据的 REST 服务
/// </summary>
/// <param name="fileName">上传的文件名</param>
/// <param name="stream">POST 过来的数据</param>
/// <returns></returns>
[OperationContract]
[WebInvoke(UriTemplate = "UploadString/?fileName={fileName}", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
public bool UploadString(string fileName, Stream stream)
{
// 文件的服务端保存路径
string path = Path.Combine("C:\\", fileName);
try
{
using (StreamReader sr = new StreamReader(stream))
{
// 将 POST 过来的被 Base64 编码过字符串传换成 byte[]
byte[] buffer = Convert.FromBase64String(sr.ReadToEnd());
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
// 将文件写入到服务端
fs.Write(buffer, 0, buffer.Length);
}
}
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 用于演示以流的形式上传数据的 REST 服务
/// </summary>
/// <param name="fileName">上传的文件名</param>
/// <param name="stream">POST 过来的数据(流的方式)</param>
/// <returns></returns>
[OperationContract]
[WebInvoke(UriTemplate = "UploadStream/?fileName={fileName}", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
public bool UploadStream(string fileName, Stream stream)
{
// 文件的服务端保存路径
string path = Path.Combine("C:\\", fileName);
try
{
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
byte[] buffer = new byte[4096];
int count = 0;
// 每 POST 过来 4096 字节的数据,往服务端写一次
while ((count = stream.Read(buffer, 0, buffer.Length)) > 0)
{
fs.Write(buffer, 0, count);
}
}
return true;
}
catch
{
return false;
}
}
}
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
<StackPanel Margin="5" Width="200">
<TextBox x:Name="lblMsgString" Margin="5" />
<ProgressBar x:Name="progressBarString" Height="20" Margin="5" Minimum="0" Maximum="100" />
<Button x:Name="btnString" Content="上传文件(字符串的方式)" Margin="5" Click="btnString_Click" />
</StackPanel>
<StackPanel Margin="5" Width="200">
<TextBox x:Name="lblMsgStream" Margin="5" />
<ProgressBar x:Name="progressBarStream" Height="20" Margin="5" Minimum="0" Maximum="100" />
<Button x:Name="btnStream" Content="上传文件(流的方式)" Margin="5" Click="btnStream_Click" />
</StackPanel>
</StackPanel>
</UserControl>
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Windows.Resources;
using System.ComponentModel;
using System.Windows.Browser;
namespace Silverlight20.Communication
{
public partial class WebClientUpload : UserControl
{
// 用于演示以字符串的形式上传数据
string _urlString = "http://localhost:3036/REST.svc/UploadString/?fileName=";
// 用于演示以流的形式上传数据
string _urlStream = "http://localhost:3036/REST.svc/UploadStream/?fileName=";
public WebClientUpload()
{
InitializeComponent();
}
/// <summary>
/// 演示字符串式上传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnString_Click(object sender, RoutedEventArgs e)
{
string data = "";
/*
* OpenFileDialog - 文件对话框
* ShowDialog() - 显示文件对话框。在文件对话框中单击“确定”则返回true,反之则返回false
* File - 所选文件的 FileInfo 对象
*/
OpenFileDialog dialog = new OpenFileDialog();
if (dialog.ShowDialog() == true)
{
using (FileStream fs = dialog.File.OpenRead())
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
// 将指定的 byte[] 转换为字符串(使用Base64编码)
data = Convert.ToBase64String(buffer);
}
/*
* WebClient - 将数据发送到指定的 URI,或者从指定的 URI 接收数据的类
* UploadStringCompleted - 上传数据完毕后(包括取消操作及有错误发生时)所触发的事件
* UploadProgressChanged - 上传数据过程中所触发的事件。正在上传或上传完全部数据后会触发
* Headers - 与请求相关的的标头的 key/value 对集合
* UploadStringAsync(Uri address, string data) - 以字符串的形式上传数据到指定的 URI。所使用的 HTTP 方法默认为 POST
* Uri address - 接收上传数据的 URI
* string data - 需要上传的数据
*/
System.Net.WebClient clientUploadString = new System.Net.WebClient();
clientUploadString.UploadStringCompleted += new UploadStringCompletedEventHandler(clientUploadString_UploadStringCompleted);
clientUploadString.UploadProgressChanged += new UploadProgressChangedEventHandler(clientUploadString_UploadProgressChanged);
Uri uri = new Uri(_urlString + dialog.File.Name, UriKind.Absolute);
clientUploadString.Headers["Content-Type"] = "application/x-www-form-urlencoded";
clientUploadString.UploadStringAsync(uri, data);
}
}
void clientUploadString_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
{
/*
* UploadProgressChangedEventArgs.ProgressPercentage - 上传完成的百分比
* UploadProgressChangedEventArgs.BytesSent - 当前发送的字节数
* UploadProgressChangedEventArgs.TotalBytesToSend - 总共需要发送的字节数
* UploadProgressChangedEventArgs.BytesReceived - 当前接收的字节数
* UploadProgressChangedEventArgs.TotalBytesToReceive - 总共需要接收的字节数
* UploadProgressChangedEventArgs.UserState - 用户标识
*/
lblMsgString.Text = string.Format("上传完成的百分比:{0}\r\n当前发送的字节数:{1}\r\n总共需要发送的字节数:{2}\r\n当前接收的字节数:{3}\r\n总共需要接收的字节数:{4}\r\n",
e.ProgressPercentage.ToString(),
e.BytesSent.ToString(),
e.TotalBytesToSend.ToString(),
e.BytesReceived.ToString(),
e.TotalBytesToReceive.ToString());
progressBarString.Value = (double)e.ProgressPercentage;
}
void clientUploadString_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
/*
* UploadStringCompletedEventArgs.Error - 该异步操作期间是否发生了错误
* UploadStringCompletedEventArgs.Cancelled - 该异步操作是否已被取消
* UploadStringCompletedEventArgs.Result - 服务端返回的数据(字符串类型)
* UploadStringCompletedEventArgs.UserState - 用户标识
*/
if (e.Error != null)
{
lblMsgString.Text += e.Error.ToString();
return;
}
if (e.Cancelled != true)
{
var jsonObject = System.Json.JsonObject.Parse(e.Result);
lblMsgString.Text += string.Format("是否上传成功:{0}",
(bool)jsonObject);
}
}
/// <summary>
/// 演示流式上传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStream_Click(object sender, RoutedEventArgs e)
{
FileStream fs = null;
OpenFileDialog dialog = new OpenFileDialog();
if (dialog.ShowDialog() == true)
{
fs = dialog.File.OpenRead();
/*
* WebClient - 将数据发送到指定的 URI,或者从指定的 URI 接收数据的类
* OpenWriteCompleted - 在打开用于上传的流完成时(包括取消操作及有错误发生时)所触发的事件
* WriteStreamClosed - 在写入数据流的异步操作完成时(包括取消操作及有错误发生时)所触发的事件
* UploadProgressChanged - 上传数据过程中所触发的事件。如果调用 OpenWriteAsync() 则不会触发此事件
* Headers - 与请求相关的的标头的 key/value 对集合
* OpenWriteAsync(Uri address, string method, Object userToken) - 打开流以使用指定的方法向指定的 URI 写入数据
* Uri address - 接收上传数据的 URI
* string method - 所使用的 HTTP 方法(POST 或 GET)
* Object userToken - 需要上传的数据流
*/
System.Net.WebClient clientUploadStream = new System.Net.WebClient();
clientUploadStream.OpenWriteCompleted += new OpenWriteCompletedEventHandler(clientUploadStream_OpenWriteCompleted);
clientUploadStream.UploadProgressChanged += new UploadProgressChangedEventHandler(clientUploadStream_UploadProgressChanged);
clientUploadStream.WriteStreamClosed += new WriteStreamClosedEventHandler(clientUploadStream_WriteStreamClosed);
Uri uri = new Uri(_urlStream + dialog.File.Name, UriKind.Absolute);
clientUploadStream.Headers["Content-Type"] = "multipart/form-data";
clientUploadStream.OpenWriteAsync(uri, "POST", fs);
}
}
void clientUploadStream_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
{
// 因为是调用 OpenWriteAsync(),所以不会触发 UploadProgressChanged 事件
lblMsgString.Text = string.Format("上传完成的百分比:{0}\r\n当前发送的字节数:{1}\r\n总共需要发送的字节数:{2}\r\n当前接收的字节数:{3}\r\n总共需要接收的字节数:{4}\r\n",
e.ProgressPercentage.ToString(),
e.BytesSent.ToString(),
e.TotalBytesToSend.ToString(),
e.BytesReceived.ToString(),
e.TotalBytesToReceive.ToString());
progressBarStream.Value = (double)e.ProgressPercentage;
}
void clientUploadStream_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e)
{
System.Net.WebClient client = sender as System.Net.WebClient;
if (e.Error != null)
{
lblMsgStream.Text += e.Error.ToString();
return;
}
if (e.Cancelled != true)
{
// e.UserState - 需要上传的流(客户端流)
Stream clientStream = e.UserState as Stream;
// e.Result - 目标地址的流(服务端流)
Stream serverStream = e.Result;
byte[] buffer = new byte[4096];
int count = 0;
// clientStream.Read - 将需要上传的流读取到指定的字节数组中
while ((count = clientStream.Read(buffer, 0, buffer.Length)) > 0)
{
// serverStream.Write - 将指定的字节数组写入到目标地址的流
serverStream.Write(buffer, 0, count);
}
serverStream.Close();
clientStream.Close();
}
}
void clientUploadStream_WriteStreamClosed(object sender, WriteStreamClosedEventArgs e)
{
if (e.Error != null)
{
lblMsgStream.Text += e.Error.ToString();
return;
}
else
{
lblMsgStream.Text += "上传完成";
}
}
}
}
/*
* 其他:
* 1、WebClient 对象一次只能启动一个请求。如果在一个请求完成(包括出错和取消)前,即IsBusy为true时,进行第二个请求,则第二个请求将会抛出 NotSupportedException 类型的异常
* 2、如果 WebClient 对象的 BaseAddress 属性不为空,则 BaseAddress 与 URI(相对地址) 组合在一起构成绝对 URI
* 3、WebClient 类的 AllowReadStreamBuffering 属性:是否对从 Internet 资源接收的数据做缓冲处理。默认值为true,将数据缓存在客户端内存中,以便随时被应用程序读取
*/
[源码下载]
上接稳扎稳打Silverlight(20) - 2.0通信之WebClient, 以字符串的形式上传/下载数据相关推荐
- 稳扎稳打Silverlight(13) - 2.0交互之鼠标事件和键盘事件
[索引页] [×××] 稳扎稳打Silverlight(13) - 2.0交互之鼠标事件和键盘事件 作者:webabcd 介绍 Silverlight 2.0 人机交互:响应用户的鼠标操作和键盘操作 ...
- 稳扎稳打Silverlight(17) - 2.0数据之详解DataGrid, 绑定数据到ListBox
[索引页] [源码下载] 稳扎稳打Silverlight(17) - 2.0数据之详解DataGrid, 详解ListBox 作者:webabcd 介绍 Silverlight 2.0 详解DataG ...
- 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape
[索引页] [×××] 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape 作者:webabcd 介绍 Silverlight 2.0 图 ...
- 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool
[索引页] [源码下载] 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool 作者:webabcd 介绍 S ...
- 稳扎稳打Silverlight(33) - 3.0控件之AutoCompleteBox, DataPager
[索引页] [源码下载] 稳扎稳打Silverlight(33) - 3.0控件之AutoCompleteBox, DataPager 作者:webabcd 介绍 Silverlight 3.0 控件 ...
- 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器...
[索引页] [×××] 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器 作者:webabcd 介绍 Silverlight 2.0 ...
- linux命令行连接百度网盘快速上传下载数据(bypy)
摘要 现在的深度学习代码基本都是在服务器上运行,而大部分的服务器都是远程服务器,只支持命令行操作,所以有些在图形界面上比较容易下载的文件,在服务器上使用命令行很难下载.而且由于远程服务器和本地之间数据 ...
- 使用securecrt在本地与服务器之间上传下载数据
第一种方式: 1.首先安装:apt install lrzsz lrzsz是一款在Linux里可代替ftp上传和下载的程序. 2.设置上传和下载目录:选项-->会话选项-->X/Y/Zmo ...
- CD传输 上传/下载数据
IBM Sterling Connect:Direct 传输前需要定义好目标路径和远程路径,以及文件名和对端ip. 传输前需要确定CD已启动,否则用CD用户执行cdstart.sh #CD配置 CDD ...
最新文章
- 只需三分钟您就可以用nodejs搭建静态网页服务器(配置静态网页访问目录)
- cms监控android,CMSV9道路监控终端
- VTK:旋转actor用法实战
- python保存数据_Python 保存数据的方法(4种方法)
- 【python数据挖掘课程】十.Pandas、Matplotlib、PCA绘图实用代码补充
- 原神服务器维护后抽奖池会更新吗,原神:武器池改动,玩家的诉求再次得到反馈!PS端将与官服互通!...
- 平板电脑有什么用_除了盖泡面,平板电脑没什么用了
- linux系统声卡安装教程,Linux系统下如何安装声卡驱动?
- 扩展中断控制器8259实验_「正点原子FPGA连载」第十三章双核AMP实验
- 成年人的生活到底有多心酸?
- c语言枚举常量,浅述C语言中枚举enum的用法
- HarmonyOS 正式登陆华为手机,4月陆续升级!
- form的get与post方式的区别(转)
- 心电图分析软件_狼疮性心肌炎39例临床特点及预后分析
- CentOS安装锐捷认证客户端
- wpa_supplicant Day1: supplicant基本概念
- 005_软件安装之_常用办公软件
- SqlServer 2008出现远程过程调用失败,错误代码[Ox800706be]
- 爬虫如何爬取猫眼电影TOP榜数据
- HTTP、FTP状态码 汇总
热门文章
- 微信小程序万里目_4款万里挑一的微信小程序,每一个都是黑科技!
- bash 脚本的自解压流程
- vba给服务器发送消息,使用VBA实现发邮件功能
- 广西师范大学c语言期末试题,广西师范大学 据库原理(A卷).doc
- TCL中关于管脚(Ports)的一些使用方法?
- Python使用xlrd和xlwt读取和写入excel详细教程
- pyhon 数据类型转换函数
- 《敏捷制造——敏捷集成基础结构设计》——1.2相关问题的国内外研究现状
- 为Apache动态增加模块
- import javax.servlet 出错(真的很管用)