跟踪文件下载ASP.Net中的命中/计数

时间:2010-07-01 03:10:13

标签: c# asp.net

是否有办法固有/手动记录ASP站点中特定文件的访问次数。例如,我在服务器上有一些.mp3文件,我想知道每个文件被访问过多少次。

跟踪此问题的最佳方式是什么?

3 个答案:

答案 0 :(得分:12)

,有几种方法可以做到这一点。这是你如何做到的。

不是使用<a href="http://mysite.com/music/song.mp3"></a>之类的直接链接从磁盘提供mp3文件,而是编写HttpHandler来提供文件下载。在HttpHandler中,您可以更新数据库中的file-download-count。

文件下载HttpHandler

//your http-handler
public class DownloadHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string fileName = context.Request.QueryString["filename"].ToString();
        string filePath = "path of the file on disk"; //you know where your files are
        FileInfo file = new System.IO.FileInfo(filePath);
        if (file.Exists)
        {
            try
            {
                //increment this file download count into database here.
            }
            catch (Exception)
            {
                //handle the situation gracefully.
            }
            //return the file
            context.Response.Clear();
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
            context.Response.AddHeader("Content-Length", file.Length.ToString());
            context.Response.ContentType = "application/octet-stream";
            context.Response.WriteFile(file.FullName);
            context.ApplicationInstance.CompleteRequest();
            context.Response.End();
        }
    }
    public bool IsReusable
    {
        get { return true; }
    }
}  

Web.config配置

//httphandle configuration in your web.config
<httpHandlers>
    <add verb="GET" path="FileDownload.ashx" type="DownloadHandler"/>
</httpHandlers>  

从前端链接文件下载

//in your front-end website pages, html,aspx,php whatever.
<a href="FileDownload.ashx?filename=song.mp3">Download Song3.mp3</a>

另外,您可以将web.config中的mp3扩展名映射到HttpHandler。要做到这一点,你必须确保,你配置你的IIS将.mp3扩展请求转发到asp.net工作进程而不是直接提供,并确保mp3文件不在处理程序捕获的同一位置,如果在同一位置的磁盘上找到该文件,那么HttpHandler将被覆盖并且该文件将从磁盘提供。

<httpHandlers>
    <add verb="GET" path="*.mp3" type="DownloadHandler"/>
</httpHandlers>

答案 1 :(得分:2)

您可以做的是创建一个通用处理程序(* .ashx文件),然后通过以下方式访问该文件:

  

Download.ashx?FILE = somefile.mp3

在处理程序中,您可以运行代码,记录访问权限并将文件返回给浏览器 确保您进行了正确的安全检查,因为这可能会被用于访问您的网络目录中的任何文件,甚至是整个文件系统!

如果您知道所有文件都是* .mp3,则第二个选项是将其添加到httpHandlers文件的web.config部分:

<add verb="GET" path="*.mp3" type="<reference to your Assembly/HttpHandlerType>" />

在HttpHandler中运行代码。

答案 2 :(得分:1)

使用HttpHandler进行下载计数的问题是,当有人开始下载您的文件时,它会触发。但是很多互联网蜘蛛,搜索引擎等都会开始下载,很快就会取消它!当他们下载文件时你会被注意到。

更好的方法是创建一个分析IIS统计信息文件的应用程序。因此,您可以检查用户下载的字节数。如果字节与文件大小相同或更大,则表示用户下载了完整文件。其他尝试只是尝试。