Filehandler in

I need to track when a pdf is opened in my web app. Right now I am writing to a database when a user clicks on the link and then using from the code behind which isn’t ideal since Safari blocks popups and other web browsers give a warning when it runs so I was thinking would a Filehandler be what I need to use. I haven’t used a Filehandler in the past so is this something that would work? The pdf is not in binary form, it’s just a static file sitting in a directory.


Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Create an ASHX (faster than aspx onload event) page, pass a the id of the file as a querystring to track each download

 public class FileDownload : IHttpHandler
    public void ProcessRequest(HttpContext context)
            //Track your id
            string id = context.Request.QueryString["id"];
            //save into the database 
            string fileName = "YOUR-FILE.pdf";
            context.Response.ContentType = "application/pdf";
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
            context.Response.TransmitFile(filePath + fileName);
           //download the file

in your html should be something like this
<a href="/GetFile.ashx?id=7" rel="nofollow noreferrer noopener" target="_blank">

window.location = "GetFile.ashx?id=7";

but I’d prefer to stick to the link solution.

Method 2

Here is an option for a custom HttpHandler that with use a regular anchor tag to a PDF:

Create the ASHX (Right-click your project -> Add New Item -> Generic Handler)

using System.IO;
using System.Web;

namespace YourAppName
    public class ServePDF : IHttpHandler
        public void ProcessRequest(HttpContext context)
            string fileToServe = context.Request.Path;
            //Log the user and the file served to the DB
            FileInfo pdf = new FileInfo(context.Server.MapPath(fileToServe));
            context.Response.ContentType = "application/pdf";
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + pdf.Name);
            context.Response.AddHeader("Content-Length", pdf.Length.ToString());

        public bool IsReusable
                return false;

Edit the web.config to use your Handler for all PDFs:
    <add verb="*" path="*.pdf" type="YourAppName.ServePDF" />

Now regular links to PDFs will use your handler to log activity and serve the file
<a href="/pdf/Newsletter01.pdf" rel="nofollow noreferrer noopener">Download This</a>

All methods was sourced from or, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Notify of

Inline Feedbacks
View all comments
Would love your thoughts, please comment.x