2009-05-24 10 views
0

J'ai une page utilisateurs qui téléchargent des fichiers à partir de là. Et lorsqu'un utilisateur clique sur le lien de téléchargement et termine le téléchargement du fichier, j'insère un nouvel enregistrement pour mon événement de téléchargement de fichier. (FileID, Date, blalbla ..)ASP.NET Response.End Problème

Mais il y a un problème avec mon script ... après le téléchargement commence et se termine, son ajout d'un nouvel enregistrement, mais après cela, son incendie déclenche à nouveau l'événement et de faire un nouveau record aussi. 1 téléchargement et 2 nouveaux enregistrements de téléchargement. voici mon script;

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

Utilisez-vous OutputCache sur cette page? –

+0

J'espère que ce lien ci-dessous vous aiderons ... http://stackoverflow.com/questions/10829168/can-we-use-response-flush-instead-of-response-end/17038408 # 17038408 – Viishnuu

Répondre

2

Le problème est que le navigateur effectue deux requêtes pour obtenir le fichier. C'est un comportement typique.

Soit vous pouvez activer OutputCaching sur cette page. Cela devrait signifier que la deuxième requête du navigateur ne touchera pas votre serveur, et donc n'enregistrera qu'une seule entrée, mais vous devez également vous assurer que l'indicateur de débogage n'est pas défini dans votre fichier web.config.

L'autre option consiste à détecter le type de requête. Je pense que la première requête envoyée par le navigateur est souvent une demande HEAD et non un GET ou POST. Vous pouvez les détecter et les gérer de manière appropriée, mais je pense que la première option peut-être plus fiable.

En outre, vous devriez vraiment coder ceci comme un ASPX Handler pas une page. Cela signifie que vous pouvez éviter le response.Clear() et ainsi vous ne confondez pas le navigateur quant au type de contenu de l'URI.

+0

J'ai Supprimer Response.End et Response.Flush de la fin du fichier de codage.Et le problème résolu.Thanx de toute façon. –