具有大结果集的WCF方法 - 直观地跟踪传输进度

时间:2009-09-14 14:24:27

标签: wcf silverlight progress-bar

我有一个WCF服务,必须返回一些可能大到10mb或更多的数据集,我想为用户提供一些视觉反馈,有没有办法跟踪下载进度?

我的客户端是Silverlight 3,最终我希望能够将进度条绑定到此;任何想法?

编辑:在赏金之后,SO不会自动选择带有upvotes的答案作为正确的答案。

4 个答案:

答案 0 :(得分:5)

代码项目中有一个示例,请参阅:

http://www.codeproject.com/KB/WCF/WCF_FileTransfer_Progress.aspx

答案 1 :(得分:1)

如果您有一个巨大的WCF呼叫,那么您只有两个状态,一切或全无。此外,WCF具有最大事务大小,因此返回大型数据集可能会超出此限制。

为了在我的项目中解决这些问题,我将一个大请求拆分为许多较小的请求。然后,我会检查我对原始请求的响应数量,以获得进度指示。

编辑:添加了更好的解释。

答案 2 :(得分:0)

CodeProject article使用Silverlight可能很棘手,因为Silverlight只能访问BasicHttpBinding - 尽管看起来BasicHttpBinding有一个TransferMode =“Streamed”所以​​也许它是可能的 - 我不是知道。

如果你可以让它返回一个Stream,那么这似乎是最好的方法。

尽管如此,我还是认为我会提出一个随机的“其他”方法。

也许您可以将数据序列化为文件并使用WebClient进行下载。所以基本上,你会有一个WS.GetData(),它会在服务器上保存一个文件并返回它的文件名 - 然后Silverlight应用程序将使用WebClient下载它(它有一个DownloadProgressChanged事件)。

我知道这不是你想要的 - 只是一个想法......

答案 3 :(得分:0)

编辑:我回答这个问题,你想要一个银色上传器,但它实际上看起来你想要一个silverlight下载器。你可以做我为上传者建议的事情,除了使用HTTP GET,二进制WCF或套接字。

我编写了一个带有进度条的Silverlight 2上传器,我在this之后对其进行了建模。它使用HTTP POST一次一个地将文件发送到服务器。棘手的部分是POST越大,文件上传的速度就越快,但是每个POST只会更新一次进度条。所以我编写了一个算法,动态地尝试找到最小的POST大小,花费不到一秒钟。

如果你想使用WCF而不是HTTP POST,那可能会更好,因为Silverlight 3现在支持二进制消息编码:

< customBinding>    < binding name =“MyBinaryBinding”maxBufferSize =“2147483647”      maxReceivedMessageSize = “2147483647” >    < binaryMessageEncoding />    < httpTransport />    < /结合> < / customBinding>

或者你可以写一个套接字实现 - Silverlight确实支持这个但是设置起来有点棘手,并要求你的服务器有一个4502-4532范围内的端口打开,端口943打开{{3} }。