Using a Generic Handler to download files from server has couple of advantages, I list some of them:

1. Download Statistics.

2. Download Tracking.

3. Download Protection.

4. Other business request.

So I suggest that you always use Generic Handler to download files from server.

Here I will show how to implement it.

1. Add Generic Handler and name it to “Download.ashx”.

2. Add code to the download handler

public class Download : IHttpHandler

        public void ProcessRequest(HttpContext context)
            //add some logic to validate the user if he has access to download file
            if (context.User.Identity.IsAuthenticated)
                string file = context.Request.QueryString["file"];
                if (!string.IsNullOrEmpty(file) && File.Exists(context.Server.MapPath(file)))
                    context.Response.ContentType = "application/octet-stream";
                    //I have set the ContentType to "application/octet-stream" which cover any type of file
                    context.Response.AddHeader("content-disposition", "attachment;filename=" + Path.GetFileName(file));
                    //here you can do some statistic or tracking
                    //you can also implement other business request such as delete the file after download
                    context.Response.ContentType = "text/plain";
                    context.Response.Write("File cannot be found!");

        public bool IsReusable
                return false;

3. Finally we only need to add one line code to download page.

<a href="Download.ashx?file=HelloWorld.txt">Download</a>

Hope this helps!

Thanks for reading!