使用Silverlight 2b2上传二进制数据

时间:2008-08-15 19:37:58

标签: .net silverlight

我正在尝试将文件或数据流上传到我们的网络服务器,但我找不到这样做的好方法。我试过WebClientWebRequest两个都有问题。

Web客户端
很好,很简单,但是你没有得到异步上传已经完成的任何通知,并且UploadProgressChanged事件没有得到任何有用的回调。另一种方法是将二进制数据转换为字符串并使用UploadStringASync,因为至少你得到一个UploadStringCompleted,问题是你需要大量的ram来处理大文件,因为它编码所有数据并上传它一气呵成。

HttpWebRequest的
有点复杂,但仍然做我需要的,我得到的问题是,即使它在后台线程(据说)被调用,它似乎仍然阻止我的UI和整个浏览器,直到上传完成,这似乎不相当右。

普通的.net确实有一些适用于OnUploadDataCompletedWebClient方法和进展但是这些在Silverlight .net中是不可用的......我认为这是一个很大的遗漏!

有没有人有任何解决方案,我需要优先上传多个二进制文件并取得进展,但我需要在文件完成上传后执行一些操作。

期待对此有所帮助。

4 个答案:

答案 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>在上传流代码期间更新进度条的请求。

感谢您的建议。