Silverlight 2中实现文件上传和电子邮件发送
【IT168技术专稿】
我们知道,在Silverlight 2中提供了丰富的网络通信API,包括支持SOAP服务、REST服务、基于HTTP通信、Socket通信等。本文我将通过一个几个示例来演示如何在Silverlight 2中实现文件上传和电子邮件发送。
1. 使用Web Service上传文件
我将通过一个示例来展示如何使用Web Service向服务器上传文件,首先创建Silverlight项目,并在Web测试项目中添加一个ASP.NET Web Service文件。现在来实现相关的WebMethod,在此方法中,将会接收两个参数:字节数组和文件扩展名,并会在服务器上创建文件,如下代码所示:
C#
[WebMethod]
public int UploadFile(byte[] FileByte, String FileExtention)
{
FileStream stream = new FileStream(String.Format(@"D:\example.{0}", FileExtention),FileMode.CreateNew);
stream.Write(FileByte, 0, FileByte.Length);
stream.Close();
return FileByte.Length;
}
添加一个简单的界面,供用户选择本地文件,我们将在按钮单击单击事件中调用Web Service,如下代码所示:
XAML
<Canvas Background="#FF333333">
<TextBox x:Name="txtFile"></TextBox>
<Button x:Name="btnUpload" Click="OnUploadClick"></Button>
<TextBlock x:Name="tblStatus"></TextBlock>
</Canvas>
调用Web Service上传文件,此处使用了OpenFileDialog对象弹出择窗口以便选择文件,此对象将选择的文件作为Stream返回,我们把Stream转换为一个字节数据传递给Web Service,如下代码所示:
void OnUploadClick(object sender, RoutedEventArgs e)
{
OpenFileDialog openFile = new OpenFileDialog(); if (openFile.ShowDialog() == DialogResult.OK)
{
String fileName = openFile.SelectedFile.Name; FileServiceSoapClient client = new FileServiceSoapClient();
client.UploadFileCompleted += new EventHandler<UploadFileCompletedEventArgs>(OnUploadFileCompleted); Stream stream = (Stream)openFile.SelectedFile.OpenRead();
stream.Position = 0;
byte[] buffer = new byte[stream.Length + 1];
stream.Read(buffer, 0, buffer.Length);
String fileExtention = fileName.Substring(fileName.IndexOf('.') + 1); client.UploadFileAsync(buffer, fileExtention);
}
} void OnUploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
{
if (e.Error == null)
{
tblStatus.Text = "上传文件成功!";
}
}
运行程序后,选择一个文件并上传,如下图所示:

至此,我们就完成了一个使用Web Service上传文件的示例,后面的章节我还会介绍在Silverlight中使用WCF等其它方式上传文件。
2. 使用WCF上传文件
前面我介绍了如何使用Web Service上传文件,同样也可以使用WCF来实现文件上传,我们通过一个示例来说明这一点。首先定义上传文件服务契约,如下代码所示:
C#
[ServiceContract]
public interface IFileService
{
[OperationContract]
void Upload(byte[] FileByte, String FileExtention);
}
编写服务实现,在Upload方法里面,实现将文件写入服务器,此处为了演示使用了绝对路径和固定的文件名,在实际开发中大家可以根据实际需要来设置具体文件命名规则以及保存路径,如下代码所示:
public void Upload(byte[] FileByte, String FileExtention)
{
FileStream stream = new FileStream(@"D:\Example." + FileExtention, FileMode.Create);
stream.Write(FileByte, 0, FileByte.Length); stream.Close();
stream.Dispose();
}
修改配置配置文件,别忘了设置绑定为basicHttpBinding,并添加服务引用。编写一个简单的用户界面,大家可以参考使用Web Service上传文件一节中的代码,这里不再重复,直接编写代码调用WCF服务,如下代码所示:
C#
void OnUploadClick(object sender, RoutedEventArgs e)
{
OpenFileDialog openFile = new OpenFileDialog(); if (openFile.ShowDialog() == DialogResult.OK)
{
String fileName = openFile.SelectedFile.Name; FileServiceClient client = new FileServiceClient();
client.UploadCompleted += new EventHandler<AsyncCompletedEventArgs>(OnUploadCompleted); Stream stream = (Stream)openFile.SelectedFile.OpenRead();
stream.Position = 0;
byte[] buffer = new byte[stream.Length + 1];
stream.Read(buffer, 0, buffer.Length);
String fileExtention = fileName.Substring(fileName.IndexOf('.') + 1); client.UploadAsync(buffer, fileExtention);
}
} void OnUploadCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Error == null)
{
tblStatus.Text = "上传文件成功!";
}
}
整个过程与使用Web Service上传文件基本一致。但是当我们上传大文件时将会遇到一些问题,basicHttpBinding绑定默认的字节大小是65536字节,所以需要做一些修改,如下代码所示:
XML
<bindings>
<basicHttpBinding>
<binding name="uploadBinding" maxReceivedMessageSize="4000000" maxBufferSize="4000000">
<readerQuotas maxArrayLength="4000000" maxStringContentLength="4000000"/>
</binding>
</basicHttpBinding>
</bindings>
大家可以根据开发中的实际需求来进行设定可以上传文件的大小。
3. 在Silverlight 2中发送电子邮件
众所周知,发送电子邮件需要使用SMTP协议,遗憾是Silverlight中并不支持SMTP通信,但是我们可以借助于Web Service来发送电子邮件。本节将通过一个示例讲解这一内容,最终完成的效果如下图所示: 
我们首先添加一个ASP.NET Web Service,并实现WebMethod,此方法将接受四个参数:发件人、收件人、邮件主题以及邮件内容,并使用SmtpClient对象发送邮件,关于SmtpClient的使用,大家可以参考MSDN,它位于System.Net.Mail命名空间下。如下代码所示:
C#
[WebMethod]
public bool Send(String fromAddress,String toAddress,String subject,String body)
{
try
{
MailMessage msg = new MailMessage();
msg.From = new MailAddress(fromAddress);
msg.To.Add(new MailAddress(toAddress));
msg.Subject = subject;
msg.Body = body;
msg.IsBodyHtml = false; SmtpClient smtp = new SmtpClient();
smtp.EnableSsl = true;
smtp.Send(msg); return true;
}
catch
{
return false;
}
}
使用SmtpClient需要在Web.config文件中配置一下邮件服务器,这里使用Google的服务器,大家可以使用自己的Gmail帐号,如下代码所示:
XML
<system.net>
<mailSettings>
<smtp>
<network host="smtp.gmail.com" port="587" userName="terrylee@gmail.com" password="password"/>
</smtp>
</mailSettings>
</system.net>
在浏览器中测试Web Service,确保它可以正确的发送邮件。编写一个简单
用户界面,如下代码所示:
XAML
<Grid x:Name="LayoutRoot" Background="#333333">
<TextBox x:Name="txtToEmailAddress"></TextBox>
<TextBox x:Name="txtSubject"></TextBox>
<TextBox x:Name="txtBody"></TextBox>
<Button x:Name="btnSend" Content="发 送"
Click="OnSendClick"></Button>
</Grid>
在Silverlight项目中添加Web Service引用,并编写代码来调用Web Service,相信大家都已经熟悉了该如何调用,如下代码所示:
C#
void OnSendClick(object sender, RoutedEventArgs e)
{
// 发送邮件地址
String fromAddress = "terrylee@gmail.com"; EmailServiceSoapClient client = new EmailServiceSoapClient();
client.SendCompleted += new EventHandler<SendCompletedEventArgs>(OnSendCompleted);
client.SendAsync(fromAddress,
this.txtToEmailAddress.Text,
this.txtSubject.Text,
this.txtBody.Text);
} void OnSendCompleted(object sender, SendCompletedEventArgs e)
{
if (e.Result)
{
HtmlPage.Window.Alert("发送邮件成功!");
}
else
{
HtmlPage.Window.Alert("发送邮件成功!");
}
}
注意在OnSendCompleted中我使用了HtmlPage对象来弹出一个浏览器对话框,这部分内容我们将在与浏览器集成一章详细讲解。
运行后输入相关信息,并发送邮件,如下图所示:

至此我们就完成一个在Silverlight中发送电子邮件的示例,大家如果有兴趣,还可以为其加上更加丰富的功能,如添加抄送人、密送人以及附件等。
Silverlight 2中实现文件上传和电子邮件发送的更多相关文章
- IIS 7 中设置文件上传大小的方法
在IIS 6.0中设置文件上传大小的方法,就是配置如下节点: <system.web> <httpRuntime maxRequestLength="1918200&quo ...
- 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件(转)
引言 这两天沉迷了Google SketchUp,刚刚玩够,一时兴起,研究了一下WebBrowser. 我在<WebBrowser控件使用技巧分享>一文中曾谈到过“我现在可以通过WebBr ...
- PHP中,文件上传实例
PHP中,文件上传一般是通过move_uploaded_file()来实现的. bool move_uploaded_file ( string filename, string destinati ...
- MVC中的文件上传-小结
web开发中,文件的上传是非常基本功能之一. 在asp.net中,通常做法是利用webservice 来接收文件请求,这样做的好处就是全站有了一个统一的文件上传接口,并且根据网站的实际情况,可以将we ...
- ASP.NET中的文件上传大小限制的问题
一.文件大小限制的问题 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文 ...
- struts2中的文件上传,文件下载
文件上传: Servlet中的文件上传回顾 前台页面 1.提交方式post 2.表单类型 multipart/form-data 3.input type=file 表单输入项 后台 apache提交 ...
- 转:在Struts 2中实现文件上传
(本文转自:http://www.blogjava.net/max/archive/2007/03/21/105124.html) 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题 ...
- ASP.NET Core 中的文件上传
ASP.NET Core上传文件 ASP.NET Core使用IFormFile来读取上传的文件内容,然后将数据写入到磁盘或其它存储空间. 添加FileUpload模型,用来接收上传的文件内容. pu ...
- javaWeb中的文件上传下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
随机推荐
- 无记录时显示gridview表头,并增加一行显示“没有记录”【绑定SqlDataSource控件时】
原文发布时间为:2008-08-04 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...
- Maven自动部署(SCM-SVN/Git)(maven-scm-plugin/maven-release-plugin插件的使用)
以下内容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_deployment_automation.html ...
- oracle内核学习总结
http://blog.csdn.net/bcbobo21cn/article/category/3092145/1
- kafka-0.8.1.1总结
文件夹 一. 基础篇 1. 开篇说明 2. 概念说明 3. 配置说明 4. znode分类 5. kafka协议分类 6. Kafka线 ...
- Python机器学习-分类
监督学习下的分类模型,主要运用sklearn实践 kNN分类器 决策树 朴素贝叶斯 实战一:预测股市涨跌 # -*- coding: utf-8 -*- """ Crea ...
- Android Camera 拍照 三星BUG总结
Android Camera 三星BUG : 近期在Android项目中使用拍照功能 , 其他型号的手机执行成功了 只有在三星的相机上遇到了bug . BUG详细体现为 : (1) 摄像头拍照后图 ...
- Android 最新控件 Toolbar
之前Android的ActionBar好像做项目从没用过.除了google自己,并没有多少人用,究其原因,主要是由于ActionBar不够灵活,不可以随心所欲的定制,后来Goole也发现了这一点,然后 ...
- CCPhysicsSprite
#ifndef __PHYSICSNODES_CCPHYSICSSPRITE_H__ #define __PHYSICSNODES_CCPHYSICSSPRITE_H__ #include " ...
- Java数据结构与算法之排序
排序从大体上来讲,做了两件事情: 1.比較两个数据项: 2.交换两个数据项.或复制当中一项 一.冒泡排序 大O表示法:交换次数和比較次数都为O(N*N). 算法原理: 1.比較相邻的元素.假设第一个比 ...
- window.open() 父子页面的传值问题
if(window.opener){//判断是否有父窗口,即打开本页面的窗口 window.opener.location.reload();//刷新父窗口 window.op ...