我有一个页面用户从那里下载文件。当用户点击下载链接并完成下载文件时,我插入'我的文件下载计数器事件的新记录。 (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();
答案 0 :(得分:2)
问题是浏览器实际上发出了两个获取文件的请求。这是典型的行为。
您可以在此页面上打开OutputCaching。这应该意味着浏览器的第二个请求不会命中您的服务器,因此只记录一个条目,但您还需要确保没有在web.config文件中设置调试标志。
另一种选择是检测请求类型。我认为浏览器发送的第一个请求通常是HEAD请求,而不是GET或POST。你可以适当地检测和处理这些,但我认为第一种选择可能更可靠。
此外,您应该将其编码为ASPX处理程序而不是页面。这意味着您可以避免使用response.Clear()
,因此您不会混淆浏览器的URI内容类型。