之前讨论过了 Silverlight通过 WCF实现上传的方法,现在看看另一种Silverlight实现上传的方法 :WebClIEnt类实现上传,同时WEBCLIENT的 OPENWRITE也是官方提供的通常的上传方式,因为他完全就是http实现上传的原本模式,及建立http连接,打开一个可写入流,然后将文件流写入到http写入流中实现,而WCF是通过传递字节数组参数的方法,两则之间看似差不多,实际上工作原理很不同。
webclIEnt类中有几个方法,其中大部分都是请求获取相应流,只有openwrite方法是写入流。所以我们使用该方法实现上传。
工作方式:
Silverlight打开文件,获取文件流,webclIEnt 调用openwrite方法,请求服务器,打开一个可以写入流 inputStream
当该可写入流可用的时候,相应openwrite异步方法的一个回调事件,在该事件中将文件流写入到http的可写入流。服务器端接收到输入流后写入到文件流保存。
服务器端:(我擦用ASHX作为服务器端接收页,因为我们不需要返回什么信息,只接受请求,所以没用ASPX页,不过要使用ASPX也可以)
using System;
using System.Collections.Generic;
using System.linq;
using System.Web;
using System.Web.Services;
using System.IO;
namespace WebApp4SL
{
/// <summary>
/// $codebehindclassname$ 的摘要说明
/// </summary>
[WebService(namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebClIEntUpload : IhttpHandler
{
public voID ProcessRequest(httpContext context)
{
Stream s = context.Request.inputStream;
fileStream fs = new fileStream(context.Server.MapPath("Uploadfile") + "/" + "asdf.jpg",fileMode.Create);
byte[] bytes = new byte[s.Length];
s.Read(bytes,bytes.Length);
fs.Write(bytes,bytes.Length);
fs.Flush();
fs.Close();
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
客户端处理代码:
using System;
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;
namespace SilverlightTest
{
public partial class WebClIEntUpLoad : UserControl
{
public WebClIEntUpLoad()
{
InitializeComponent();
}
private voID openfile_Click(object sender,RoutedEventArgs e)
{
OpenfileDialog op = new OpenfileDialog();
if (op.ShowDialog() == true)
{
fileStream fs = op.file.OpenRead();
WebClIEnt wc = new WebClIEnt();
wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted);
wc.OpenWriteAsync(new Uri("WebClIEntUpload.ashx",UriKind.relative),"POST",fs);
}
}
voID wc_OpenWriteCompleted(object sender,OpenWriteCompletedEventArgs e)
{
try
{
Stream fs = (Stream)e.UserState;
Stream inputstream = e.Result;
byte[] bytes = new byte[fs.Length];
fs.Read(bytes,bytes.Length);
inputstream.Write(bytes,bytes.Length);
inputstream.Close();
fs.Close();
}
catch
{
info.Text = e.Error.InnerException.Message;
}
}
}
}
界面:(实在献丑,界面基本上就个按钮会用到,因为只是为了说明WEBCLIENT的上传,所以没做什么界面上的开发)
<UserControl x:Class="SilverlightTest.WebClIEntUpLoad"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WIDth="400" Height="300">
<GrID x:name="LayoutRoot" Background="White">
<button Height="24" margin="0,8,0" VerticalAlignment="top" Content="浏览" WIDth="69" HorizontalAlignment="Right" x:name="openfile" Click="openfile_Click" />
<TextBlock Height="24" margin="8,81,0" VerticalAlignment="top" Text="请选择文件" textwrapPing="Wrap" x:name="filepath"/>
<TextBlock margin="8,51,0" Text="" textwrapPing="Wrap" VerticalAlignment="top" Height="96" x:name="info"/>
</GrID>
</UserControl>
WEBCLIENT 的OPENWRITE还有个UploadProgressChanged事件,该事件指定好对应的处理函数后还可以用来获取上传进度,所以用webclIEnt来实现上传还是非常方便的,与WCF比较起来,WCF可以自由的设置参数,但是WCF的字节数组参数长度是有限制的虽然可以在WEBCONfig里进行设置,但是WCF实现上传不是官方提供的解决方案;WebclIEnt 的Openwrite方法是官方提供的文件上传解决方案,工作原理继承传统的http文件上传,同时由于发起读取文件写入流都是在客户端异步进行,所以,及时要实现分块也非常容易(webclIEnt的其他大部分方法不允许在之前的请求没完成前进行第2次请求,但是openwrite的文档中没用说明限制,我自己也没实验过,51过后再研究),但是webclIEnt请求服务器传递参数上不够灵活,部署方面也没有WCF那么松散,所以WCF上传和webclIEnt上传都是可行的,但是具体项目具体分析,采取最好的最适当的方式实现。
总结以上是内存溢出为你收集整理的Silverlight WebClient 上传实现全部内容,希望文章能够帮你解决Silverlight WebClient 上传实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)