如何使用ASP.NET跟踪下载?

时间:2010-08-02 10:21:21

标签: c# asp.net download

如何使用ASP.NET跟踪下载?

我想找到有多少用户完成了文件下载?

另外如何限制用户使用特定的IP?

例如,如果用户下载http://example.com/file.exe,该曲目将自动生效。

3 个答案:

答案 0 :(得分:3)

如果您想从您的网站计算下载次数,请创建下载页面并计算请求数:

文件链接应如Download.aspx?file=123

protected void Page_Load(object sender, EventArgs e)
{
     int id;
     if (Int32.TryParse(Request.QueryString["file"], out id))
     {
          Count(id); // increment the counter
          GetFile(id); // go to db or xml file to determine which file return to user
     }
}

Download.aspx?file=/files/file1.exe

protected void Page_Load(object sender, EventArgs e)
{
     FileInfo info = new FileInfo(Server.MapPath(Request.QueryString["file"]));
     if (info.Exists)
     {
         Count(info.Name);
         GetFile(info.FullName);
     }
}

限制访问您的下载页面:

protected void Page_Init(object sender, EventArgs e)
{
     string ip = this.Request.UserHostAddress;
     if (ip != 127.0.0.1)
     {
         context.Response.StatusCode = 403; // forbidden
     }
}

答案 1 :(得分:3)

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

不是使用<a href="http://mysite.com/music/file.exe"></a>之类的直接链接从磁盘提供文件,而是编写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=file.exe">Download file.exe</a>

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

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

答案 2 :(得分:0)

使用HttpHandler进行下载部分。例如,您可以使用OutputStream。调用此处理程序时,您可以更新数据库中的计数器。

  

另外如何限制用户使用特定的IP?

为此,您可以使用HttpModule: take a look at these samples