2009-05-24 201 views
0

我得到了一個頁面用戶從那裏下載文件。並且當用戶點擊下載鏈接並完成下載文件時,我爲我的文件下載計數器事件插入一個新記錄。 (FileID,Date,blalbla ..)ASP.NET響應。結束問題

但是我的腳本存在問題...下載開始和結束後,它添加一條新記錄,但在此之後,它再次觸發事件並創建新記錄。 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

您是否在本頁使用OutputCache? – 2009-05-24 22:36:36

+0

我希望這下面的鏈接來幫你...... http://stackoverflow.com/questions/10829168/can-we-use-response-flush-instead-of-response-end/17038408 #17038408 – Viishnuu 2013-06-11 07:16:40

回答

2

問題是,瀏覽器實際上是提出兩個請求來獲取文件。這是典型的行爲。

您可以在此頁面上打開OutputCaching。這應該意味着瀏覽器的第二個請求不會觸及您的服務器,因此只記錄一個條目,但您還需要確保您的web.config文件中沒有設置調試標誌。

另一個選項是檢測請求類型。我認爲瀏覽器發送的第一個請求通常是HEAD請求,而不是GET或POST。你可以適當地檢測和處理這些,但我認爲第一種方法可能更可靠。

此外,你應該真的把它編碼爲一個ASPX處理程序而不是頁面。這意味着您可以避開response.Clear(),因此您不會將瀏覽器混淆爲URI的內容類型。