【问题标题】:How to show feedback while streaming large files with WCF如何在使用 WCF 流式传输大文件时显示反馈
【发布时间】:2010-10-07 19:47:33
【问题描述】:

我正在通过 WCF 发送大文件,并且我正在使用 transferMode="Streamed" 以使其正常工作,并且工作正常。

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

有没有人有一个关于如何完成这个的解决方案/想法?

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

EDIT2:我的部分代码帮助其他人理解我的问题

这是我的合同

    [OperationContract]
    FileTransfer Update(FileTransfer request);

这是 FileTransfer 的定义

[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 本身会读取流,对吗?

我希望这可以帮助人们了解我的问题...如果您需要更多信息,请告诉我

【问题讨论】:

  • 你怎么能不指挥阅读? WCF 不会自行读取流,您是否为此使用了第三方组件?

标签: wcf stream large-files


【解决方案1】:

如何将总流大小添加为自定义 Soap 标头(使用 MessageContracts)。然后,您可以在客户端上以块的形式处理流(例如在循环中读取定义大小的缓冲区),并且对于每个块,您可以通知客户端在预期大小的上下文中处理的增量。

【讨论】:

  • 我喜欢这样的声音,但是,我不会做任何流操作... WCF 会处理这个问题,我的服务会在整个文件位于服务器
  • 在这种情况下,我的解决方案将不起作用。它可用于下载流而不是用于上传。
【解决方案2】:

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

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

编辑: 我的评论是在客户端正在上传数据的假设下起作用的。所以服务器知道它已经从流中读取的很多数据,而客户端知道数据的大小。 如果服务器暴露了一个操作,报告了它目前已经读取的数据量,客户端将能够通过调用这个操作来计算进度百分比。

【讨论】:

  • 来自@Ladislav 的回答。我看不到服务器如何告诉进度......这就是我问题的重点,它可能不像一个想法那么清楚:(
  • 我应该在中间添加一个新的行为还是什么?
  • 服务器不告诉进度,它通过另一个操作报告它到目前为止从客户端读取了多少。我已经相应地编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2010-10-15
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多