【问题标题】:Download very large files (8GB+) - combining WCF and WebClient?下载非常大的文件 (8GB+) - 结合 WCF 和 WebClient?
【发布时间】:2012-03-28 23:50:54
【问题描述】:

我在创建一个支持下载超大文件的 WCF 服务时遇到了一些麻烦。我已经阅读了很多关于如何将 transferMode 属性设置为 Streamed,将所有 messageSize 和 bufferSize 属性增加到 Int32.MaxValue 的指南,但我仍然没有运气。 (我还通过 MessageBodyMember 属性将流作为消息正文返回,元数据使用 MessageHeader 属性通过标头发送)。

如果我设置了所有这些属性,我可以很好地下载较小的文件,但是当我尝试下载 1-2GB 的文件时,我只会收到 400 bad request 错误,这使得调试变得相当困难......

理想情况下,我的服务应支持至少 8GB 的​​文件大小。这对 WCF 是否可行? web.config 文件的各种 messageSize 属性似乎仅限于 Int32.MaxValue,它等于最大文件大小为 2GB。

根据我的研究,我发现我似乎必须改用 WebClient.DownloadFile。 文件应仅可供拥有所需权限的用户下载。使用 WCF,我的下载方法可以采用令牌参数,只有当用户有权下载请求的文件时,服务器才能检查并返回流。使用 WebClient 方法似乎并不直接。如果有人对如何执行此操作(通过 WebClient)有一些指导,我将不胜感激。

理想情况下,我的 WCF 服务应该管理和提供用户令牌,并以某种方式将当前合法的令牌绑定到每个单独的文件(令牌应该只能使用一次)。然后应该通过 WebClient 进行下载。

提前感谢任何线索。

【问题讨论】:

  • 您必须通过 WCF 执行此操作吗?浏览器/IIS 对“普通旧文件”执行此操作就可以了。你可以只返回一个 URI 并让浏览器获取它吗?是的,你可以通过 WCF 做到这一点,但不重新发明轮子要容易得多。
  • @CraigStuntz:嗯,是也不是。作为学校项目的一部分,我需要组合一个客户端应用程序可以调用的 WCF 服务。该服务是一个媒体提供商,用户可以从中“购买”和下载媒体文件(因此需要支持大文件)。我只有通过流进行文件传输的经验,所以我不知道是否可以以某种方式托管仅在用户使用 IIS 提供某种身份验证时才可用的文件?
  • 当然,只需要在查询字符串参数中使用唯一且不可猜测的标记。您可以通过 IIS/ASP.NET 中的常用方法限制访问。

标签: c# wcf file webclient


【解决方案1】:

您可以在 WCF 中执行此操作。很多个月前,我构建了一个服务来执行此操作(我们没有将 Web 服务器作为配置的一部分)。我们使用了 WCF 流:

http://msdn.microsoft.com/en-us/library/ms733742.aspx

处理大负载的策略是流式传输。消息的同时, 尤其是那些用 XML 表示的,通常被认为是 相对紧凑的数据包,一条消息可能是多个 千兆字节的大小,类似于一个连续的数据流,而不是一个 数据包。当数据以流模式而不是 缓冲模式,发送者制作消息体的内容 以流和消息的形式提供给接收者 基础设施不断将数据从发送方转发到接收方 当它可用时。

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多