4

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

WebClient
很好很简单,但是您没有收到任何异步上传已完成的通知,并且UploadProgressChanged事件不会被任何有用的回调。另一种方法是将二进制数据转换为字符串并使用UploadStringASync,因为至少你会得到一个UploadStringCompleted,问题是你需要大量的内存来存储大文件,因为它对所有数据进行编码并一次性上传。

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

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

有没有人有任何解决方案,我需要上传多个二进制文件,最好有进度,但我需要在文件完成上传后执行一些操作。

期待一些帮助。

4

4 回答 4

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。

于 2008-08-15T20:17:44.257 回答
0

Matt Berseth 对此有一些想法,可能会有所帮助:

http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti_1.html

@Dan - 抱歉,伙计,我可以发誓马特的文章是关于 Silverlight 的,但显然不是。归咎于我刚刚喝下的那两大杯智利红。:-)

于 2008-08-15T19:44:06.680 回答
0

谢谢,我在这篇文章中看到的问题是它不是在谈论 Silverlight,而且 Silverlight 的功能有限,出于某种原因,他们无缘无故地删除了一些必要的二进制传输事件和方法。

我需要使用 Silverlight,因为我需要/想要上传多个文件,而 HTML 不允许上传多个文件。

于 2008-08-15T19:56:42.910 回答
0

这几乎就是我正在做的事情,我遇到的问题是我的 UI 被锁定了。

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

感谢您的建议。

于 2008-08-15T23:01:08.280 回答