我正在尝试将文件或数据流上传到我们的网络服务器,但我找不到这样做的好方法。我试过WebClient
和WebRequest
两个都有问题。
Web客户端
很好,很简单,但是你没有得到异步上传已经完成的任何通知,并且UploadProgressChanged
事件没有得到任何有用的回调。另一种方法是将二进制数据转换为字符串并使用UploadStringASync
,因为至少你得到一个UploadStringCompleted
,问题是你需要大量的ram来处理大文件,因为它编码所有数据并上传它一气呵成。
HttpWebRequest的
有点复杂,但仍然做我需要的,我得到的问题是,即使它在后台线程(据说)被调用,它似乎仍然阻止我的UI和整个浏览器,直到上传完成,这似乎不相当右。
普通的.net确实有一些适用于OnUploadDataCompleted的WebClient
方法和进展但是这些在Silverlight .net中是不可用的......我认为这是一个很大的遗漏!
有没有人有任何解决方案,我需要优先上传多个二进制文件并取得进展,但我需要在文件完成上传后执行一些操作。
期待对此有所帮助。
答案 0 :(得分:1)
我解决这个问题的方法是通过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。
答案 1 :(得分:0)
Matt Berseth对此有一些想法,可能有所帮助:
http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti_1.html
@Dan - 抱歉,我发誓Matt的文章是关于Silverlight的,但很明显不是。把它归咎于我刚刚击落的那两块智利红色大杯。 :-)
答案 2 :(得分:0)
谢谢,我在文章中看到的问题是它不是在谈论Silverlight,而Silverlight的功能有限,出于某种原因,他们已经无缘无故地删除了一些必要的二进制传输事件和方法。
我需要使用Silverlight,因为我需要/想要上传多个文件,HTML不允许多文件上传。
答案 3 :(得分:0)
这就是我正在做的事情,我遇到的问题是我的用户界面被锁定了。
正如你所说的我已经在做什么,我认为问题出在其他地方,所以我用旧的分歧和征服来缩小问题范围,而不是实际的更新代码,这是我尝试 Dispatch < / strong>在上传流代码期间更新进度条的请求。
感谢您的建议。