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

时间:2020-03-05 18:39:57  来源:igfitidea点击:

我正在尝试将文件或者数据流上传到我们的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被锁定了。

正如我们所建议的那样,我认为问题出在其他地方,所以我使用旧的分而治之来缩小问题的范围,并且它不是实际的更新代码,这是我尝试分派更新进度条的请求在上传流代码期间。

感谢建议。