2009-05-24 10 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を使用していますか? –

+0

私は...あなたを助けるでしょう」リンクの下にこれを期待し http://stackoverflow.com/questions/10829168/can-we-use-response-flush-instead-of-response-end/17038408 #17038408 – Viishnuu

答えて

2

問題は、ブラウザが実際にファイルを取得する2つの要求をしていることです。これは典型的な動作です。

このページのOutputCachingをオンにすることもできます。これは、ブラウザの2番目のリクエストがサーバーにヒットせず、1つのエントリだけを記録することを意味するはずですが、web.configファイルにデバッグフラグが設定されていないことも確認する必要があります。

もう1つのオプションは、要求の種類を検出することです。ブラウザが送信する最初のリクエストは、しばしばHEADリクエストであり、GETやPOSTではないと思います。これらを適切に検出して処理することができますが、最初のオプションがより信頼できると思います。

また、実際にページではなくASPXハンドラとしてコーディングする必要があります。つまり、response.Clear()を避けることができ、URIのコンテンツタイプについてブラウザを混乱させることはありません。

+0

私はResponse.EndとResponse.Flushをコードファイルの最後から削除しました。問題は解決しました。とにかく解決しました。 –