Silverlight 2中实现文件上传和电子邮件发送

 
作者:IT168 TerryLee  2008-05-30
内容导航:

使用Web Service上传文件

 

【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中实现文件上传和电子邮件发送的更多相关文章

  1. IIS 7 中设置文件上传大小的方法

    在IIS 6.0中设置文件上传大小的方法,就是配置如下节点: <system.web> <httpRuntime maxRequestLength="1918200&quo ...

  2. 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件(转)

    引言 这两天沉迷了Google SketchUp,刚刚玩够,一时兴起,研究了一下WebBrowser. 我在<WebBrowser控件使用技巧分享>一文中曾谈到过“我现在可以通过WebBr ...

  3. PHP中,文件上传实例

    PHP中,文件上传一般是通过move_uploaded_file()来实现的.  bool move_uploaded_file ( string filename, string destinati ...

  4. MVC中的文件上传-小结

    web开发中,文件的上传是非常基本功能之一. 在asp.net中,通常做法是利用webservice 来接收文件请求,这样做的好处就是全站有了一个统一的文件上传接口,并且根据网站的实际情况,可以将we ...

  5. ASP.NET中的文件上传大小限制的问题

    一.文件大小限制的问题 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文 ...

  6. struts2中的文件上传,文件下载

    文件上传: Servlet中的文件上传回顾 前台页面 1.提交方式post 2.表单类型 multipart/form-data 3.input type=file 表单输入项 后台 apache提交 ...

  7. 转:在Struts 2中实现文件上传

    (本文转自:http://www.blogjava.net/max/archive/2007/03/21/105124.html) 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题 ...

  8. ASP.NET Core 中的文件上传

    ASP.NET Core上传文件 ASP.NET Core使用IFormFile来读取上传的文件内容,然后将数据写入到磁盘或其它存储空间. 添加FileUpload模型,用来接收上传的文件内容. pu ...

  9. javaWeb中的文件上传下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

随机推荐

  1. Codeforces Round #511 (Div. 2) C. Enlarge GCD

    题目链接 题目就是找每个数的最小素因子,然后递归除,本来没啥问题,结果今天又学习了个新坑点. 我交了题后,疯狂CE,我以为爆内存,结果是,我对全局数组赋值, 如果直接赋值,会直接在exe内产生内存,否 ...

  2. openSUSE Leap 15.0 初始配置

    添加源: # 禁用原有软件源 sudo zypper mr -da # 添加阿里镜像源 sudo zypper ar -fc https://mirrors.aliyun.com/opensuse/d ...

  3. 新闻:融资600万 他用一套系统优化15大HR工作场景 精简入转调离 月开通214家 | IT桔子

    新闻:融资600万 他用一套系统优化15大HR工作场景 精简入转调离 月开通214家 | IT桔子 功劳说不上

  4. 【String】String.format(format,args...)的使用解析

    String.format(format,args...)的使用解析 使用kotlin 中使用示例 ================================================== ...

  5. BroadcastReceiver详解(二)

    BroadCastReceiver 简介 (末尾有源码) BroadCastReceiver 源码位于: framework/base/core/java/android.content.Broadc ...

  6. booth乘法器原理

    在微处理器芯片中,乘法器是进行数字信号处理的核心,同一时候也是微处理器中进行数据处理的wd=%E5%85%B3%E9%94%AE%E9%83%A8%E4%BB%B6&hl_tag=textli ...

  7. Gas Station,转化为求最大序列的解法,和更简单简单的Jump解法。——贪心、转化

    Gas Station There are N gas stations along a circular route, where the amount of gas at station i is ...

  8. Android开发的环境搭建及HelloWorld的实现

    安装JDK和配置Java开发环境 http://www.oracle.com/technetwork/java/javase/downloads/java-se-jdk-7-download-4321 ...

  9. CF 535c Tavas and Karafs

    Tavas and Karafs Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u S ...

  10. python xmlrpc

    rpc 协议 RPC = Remote Procedure Call Protocol,即远程过程调用协议. xml rpc 协议 使用http协议作为传输协议,使用xml文本传输命令和数据的一种协议 ...