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 window.open 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.
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.ClearContent();
context.Response.ContentType = "application/pdf";
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + pdf.Name);
context.Response.AddHeader("Content-Length", pdf.Length.ToString());
context.Response.TransmitFile(pdf.FullName);
context.Response.Flush();
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
Edit the web.config to use your Handler for all PDFs:
<httpHandlers>
<add verb="*" path="*.pdf" type="YourAppName.ServePDF" />
</httpHandlers>
Now regular links to PDFs will use your handler to log activity and serve the file
<a href="/pdf/Newsletter01.pdf">Download This</a>