【发布时间】: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 中的常用方法限制访问。