ASP.NET Response.End问题

时间:2009-05-24 22:34:48

标签: c# asp.net

我有一个页面用户从那里下载文件。当用户点击下载链接并完成下载文件时,我插入'我的文件下载计数器事件的新记录。 (FileID,Date,blalbla ..)

但是我的脚本存在问题...在下载开始和结束后,它添加了一条新记录,但在此之后,它再次触发事件并创建新记录。所以下载1个和2个新的下载记录。这是我的剧本;

 if (Page.Request.QueryString["FileID"] != null)
        {
            OleDbCommand command = new OleDbCommand("select * from Dosyalar where DosyaID=" + Page.Request.QueryString["FileID"].ToString(), veri.baglan());

            string dosyaAdi = "";
            int DosyaID = 0;
            OleDbDataReader dr = command.ExecuteReader();
            while (dr.Read())
            {

                dosyaAdi = Server.MapPath("formlar") + "\\" + dr["URL"].ToString();
                DosyaID = Convert.ToInt32(dr["FileID"]);

            }
            dr.Close();

            FileInfo dosya = new FileInfo(dosyaAdi);
            Response.Clear();
            Response.AddHeader("Content-Disposition", "attachment; filename=" + dosya.Name);
            Response.AddHeader("Content-Length", dosya.Length.ToString());
            Response.ContentType = "application/octet-stream";
            Response.WriteFile(dosyaAdi);
           // INSERT A NEW RECORD 
            OleDbCommand ekle = new OleDbCommand("Insert into Indirilenler (FileID,Tarih) values (@p1,@p2)", veri.baglan());
            ekle.Parameters.AddWithValue("p1", FileID);
            ekle.Parameters.AddWithValue("p2", DateTime.Now.ToShortDateString());
            ekle.ExecuteNonQuery();
            Response.Flush();
            Response.End();

1 个答案:

答案 0 :(得分:2)

问题是浏览器实际上发出了两个获取文件的请求。这是典型的行为。

您可以在此页面上打开OutputCaching。这应该意味着浏览器的第二个请求不会命中您的服务器,因此只记录一个条目,但您还需要确保没有在web.config文件中设置调试标志。

另一种选择是检测请求类型。我认为浏览器发送的第一个请求通常是HEAD请求,而不是GET或POST。你可以适当地检测和处理这些,但我认为第一种选择可能更可靠。

此外,您应该将其编码为ASPX处理程序而不是页面。这意味着您可以避免使用response.Clear(),因此您不会混淆浏览器的URI内容类型。