2010-10-07 35 views
2

我通过WCF发送大文件,并且我正在使用transferMode =“Streamed”以使其正常工作,并且工作正常。如何在使用WCF流式传输大文件时显示反馈

事情有时候这些文件太大了,我想给客户一些关于进度的反馈。

有没有人有关于如何实现这一目标的解决方案/想法?

编辑:我不命令在任何一方(客户端或服务器)读取文件,如果我做了,我只能给流的读取功能提供反馈。

EDIT2:我的代码的一部分,以帮助别人了解我的问题

这里的合同我

[OperationContract] 
    FileTransfer Update(FileTransfer request); 

和这里的文件传输的定义

[System.ServiceModel.MessageContractAttribute(WrapperName = "FileTransfer", WrapperNamespace = "http://tempuri.org/", IsWrapped = true)] 
public class FileTransfer : IDisposable 
{ 
    [System.ServiceModel.MessageBodyMemberAttribute(Namespace = "dummy", Order = 0)] 
    public Stream FileByteStream; 

    public void Dispose() 
    { 
     if (FileByteStream != null) 
     { 
      FileByteStream.Close(); 
      FileByteStream = null; 
     } 
    } 

} 

所以,在我的服务(托管在IIS上)我只是有这样的事情:

request.FileByteStream; 

和WCF本身读取流,对吧?

我希望这有助于人们搞明白我的问题...请让我知道如果你需要进一步的信息

+0

你怎么不能命令阅读? WCF将不会自己读取流,您是否使用第三方组件? – 2010-10-08 13:05:00

回答

0

约增加总流大小定制SOAP头(使用MessageContracts)什么。然后你可以在客户端处理数据流(例如在循环中读取到已定义大小的缓冲区),并且可以在每个数据块中通知客户端预期大小情况下的处理增量。

+0

我喜欢这听起来如何,但是,我不能做任何流操作... WCF照顾,我的服务开始处理(我猜)整个文件在服务器上后 – sebagomez 2010-10-07 20:34:32

+0

在这种情况下,我的解决方案不管用。它可用于下载流而不用于上传。 – 2010-10-08 07:04:09

0

我现在看到的唯一方法是创建另一个操作,报告流操作读取的字节数。这需要在服务器端激活会话和多线程,并实现来自客户端的异步调用以及对“进度报告”操作的调用。

客户端知道流的大小(假设客户端是发件人),它可以从已知的总大小和服务器报告的大小中提取进度百分比。

编辑: 我的意见是在假设客户端正在上传数据的情况下工作的。所以服务器知道它已经从流中读取了很多数据,而客户端知道数据的大小。 如果服务器公开一个操作来报告迄今已读取的数据量,则客户端将能够通过调用此操作来计算进度百分比。

+0

从@Ladislav回答。我没有看到服务器如何告诉进度......这是我的问题的全部,它可能不是一个清晰的想法:( – sebagomez 2010-10-08 12:28:54

+0

我应该在中间添加一个新的行为还是什么? – sebagomez 2010-10-08 12:29:30

+0

服务器并没有说明进展情况,它报告了迄今为止通过另一项操作从客户端读取了多少内容。我相应地编辑了我的答案。 – 2010-10-08 13:02:26