asp.net文件下载 - 跟踪下载的大小

时间:2009-12-24 14:48:47

标签: asp.net http file httphandler httpmodule

我正在尝试使用ASP.net/C#。

为这样的设计系统

用户付费下载一些内容(文件 - mp3 / PDF,doc等)。我应该能够跟踪用户下载的字节数。如果下载的字节数与服务器上的字节数相匹配,我应该在DB中设置一个标志(告知下载成功并阻止他们再次下载文件/要求他们再次支付下载费用)。如果下载不完整,他们应该能够再次下载文件而无需再付费(因为不会设置标志)。

有没有办法跟踪客户端成功下载的字节数?

当我在WinXP机器中看到文件大小时,我看到两种尺寸(磁盘大小,大小)。我应该考虑哪一个?它会因操作系统而异吗?

5 个答案:

答案 0 :(得分:7)

您可以轻松地测量在ASP.NET中传递给客户端的数据,假设您使用自己的IIS替换了直接的IIS控制下载,这将是这样的:

while (context.Response.IsClientConnected) {

    bytesRead = ReadFileChunkAsByteArrayWIthOffsetOrWhatever(buffer, offset);

    context.Response.OutputStream.Write(buffer, 0, bytesRead);
    context.Response.Flush();

    offset += bytesRead;

    if (bytesRead != bufferSize)
        break;
}

在ASP中使这100%可靠变得复杂,但是可以做到。您几乎必须考虑到每个可能的故障点并做出相应的反应。

问题仍然是 - 正如上面提到的那样 - 知道客户端收到数据是不可能的。如果这笔交易涉及金钱,那很快就会成为一个问题。

出于这个原因,最好的方法是使用自定义下载器客户端,就像亚马逊用于购买MP3文件的客户端一样。这样你就不会让自己或你的客户面对像HTTP那样不可靠的移动货币化部分的变幻莫测。

答案 1 :(得分:1)

您可以尝试查看HTTP响应代码(即:200,404等) - 客户端和服务器将交换http标头,以便他们知道发生了什么 - 您应该能够监控这些以查看响应是否是成功(不确定 - 但你应该能够)。

关于文件大小 - 我会尝试使用“已知”大小的文件进行实验,比较Http Logs告诉你的文件浏览器告诉你的内容。

此外,我已经看到报告文件上传进度的工具/ wodgets - 所以你说得对,你应该能够反过来,我想。您可以尝试查看文件上传代码示例和教程 - 您可能会得到一些提示。我无法想到任何一件事 - 抱歉。

答案 2 :(得分:1)

你可以创建一个服务文件的asp.net处理程序(对于asp.net mvc,你可以做一个结果动作......这就是我正在使用的)。确保它支持可恢复的下载。

你可以跟踪服务的字节。

聚苯乙烯。这会导致性能开销,而不是让IIS提供服务

更新1:我使用了与此http://dotnetslackers.com/articles/aspnet/Range-Specific-Requests-in-ASP-NET.aspx非常相似的内容......文章对其中的内容有一个非常明确的解释。你可能可以按原样使用那个,请参阅该帖子中的示例。

答案 3 :(得分:1)

要像这样执行自定义字节服务,您需要实现自己的http处理程序。

此处理程序应执行以下操作:

  • 在http处理程序上实现某种身份验证,以便您知道与谁打交道。
  • 然后,您需要对请求的文件和允许下载的文件实施某种日志记录。
  • 为客户端缓存实现etags和expires头。
  • 服务器端缓存
  • 缩小,压缩压缩
  • 如果您想支持可恢复的下载,则需要实施206个部分响应。这对于任何类型的流媒体和服务pdf都是必不可少的。

因此,您应该处理以下http标头:

  • 的ETag
  • 到期

  • 接受-范围

  • 范围
  • If-Range

  • 上次修改

  • 如果-匹配
  • 如果-无 - 匹配
  • 如果-Modified-Since的
  • 如果未改性的-由于
  • 除非-Modified-Since的

如果您正在寻找http处理程序的示例实现,请查看: http://code.google.com/p/talifun-web/wiki

它有一个静态文件处理程序,可以实现上述所有http标头,客户端和服务器端缓存甚至压缩。

还有一个日志模块和一个授权模块,它应该对如何实现身份验证和日志记录有很大帮助。

答案 4 :(得分:0)

您想要的大小是大小(不是磁盘上的大小)。磁盘上的大小包括通过适应分区的4K块大小而占用的额外空间。大小是文件中的确切位数。

我不相信有一个很好的方法可以说明下载已经完成。 Response.TransmitFile可能是安全发送文件的最佳方法。但是我不相信它会告诉你用户是否真的收到了这个文件。

我不知道这是支持的业务,但我想不出一个合法的业务,用户可以容忍每个购买模型的单个下载,并且标准HTTP请求/响应模型的不明确有助于制作准确的客户端接收器。更不用说这个模型可以通过在收到最后一个数据包时发送失败的响应来进行恶意攻击。

我认为使用类似下载窗口的东西(购买后2小时),然后在第一个请求完成相同的结果后将其锁定到IP,从而导致很少的用户问题和支持呼叫。此外,除非文件具有某种严格的DRM,否则允许用户根据其登录持久访问很可能是适当的商业模式,因为一旦他们获得文件,他们就可以根据自己的喜好复制它。

看看DVD或蓝光,没有任何数量的复制保护或访问控制会将你的文件保存在盗版中,因此让合法用户轻松上手。