使用Silverlight 2b2上传二进制数据
我正在尝试将文件或者数据流上传到我们的Web服务器,但找不到合适的方法。我已经尝试过WebClient和WebRequest都有问题。
网络客户端
不错,很容易,但是我们不会收到异步上传已完成的任何通知,并且不会使用任何有用的方法来调用UploadProgressChanged事件。另一种方法是将二进制数据转换为字符串并使用UploadStringASync
,因为至少我们会得到UploadStringCompleted
,问题是我们需要大量RAM来存储大文件,因为它将所有数据编码并一次性上传。
HttpWebRequest
稍微复杂一点,但是仍然可以完成所需的工作,我遇到的问题是,即使在后台线程上调用了它(据说),它似乎仍然阻塞了我的UI和整个浏览器,直到上传完成为止正确的。
普通的.net确实有一些适用于OnUploadDataCompleted和进度的" WebClient"方法,但是这些在Silverlight .net中可用...我认为是个很大的疏漏!
没有人有任何解决方案,我需要上载具有进度的多个二进制文件,但是当文件完成其上载时,我需要执行一些操作。
期待对此有所帮助。
解决方案
回答
Matt Berseth在这方面有一些想法,可能会有所帮助:
http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti_1.html
@Dan Apologies的同伴,我可以宣誓Matt的文章是关于Silverlight的,但显然不是。责怪我刚倒下的那两大杯智利红葡萄酒。 :-)
回答
谢谢,我在这篇文章中看到的问题是它没有谈论Silverlight,并且Silverlight的功能有限,由于某种原因,他们无缘无故地删除了一些必要的事件和二进制传输方法。
我需要使用Silverlight,因为我需要/想要上传多个文件,并且HTML不允许上传多个文件。
回答
我解决它的方法是通过INotifyPropertyChanged和事件通知。
要点:
public void DoIt(){ this.IsUploading = True; WebRequest postRequest = WebRequest.Create(new Uri(ServiceURL)); postRequest.BeginGetRequestStream(new AsyncCallback(RequestOpened), postRequest); } private void RequestOpened(IAsyncResult result){ WebRequest req = result.AsyncState as WebRequest; req.BeginGetResponse(new AsyncCallback(GetResponse), req); } private void GetResponse(IAsyncResult result) { WebRequest req = result.AsyncState as WebRequest; string serverresult = string.Empty; WebResponse postResponse = req.EndGetResponse(result); StreamReader responseReader = new StreamReader(postResponse.GetResponseStream()); this.IsUploading= False; } private Bool_IsUploading; public Bool IsUploading { get { return _IsUploading; } private set { _IsUploading = value; OnPropertyChanged("IsUploading"); } }
现在,由于两次和三次异步调用,silverlight是一个PiTA。
回答
这几乎就是我正在做的事情,我遇到的问题是我的UI被锁定了。
正如我们所建议的那样,我认为问题出在其他地方,所以我使用旧的分而治之来缩小问题的范围,并且它不是实际的更新代码,这是我尝试分派更新进度条的请求在上传流代码期间。
感谢建议。