2009-09-02 6 views
1

Lorsqu'un utilisateur télécharge un fichier à partir de mon application ASP.NET, la session expire quelques secondes après le téléchargement du fichier. Avant l'expiration de la session, il est possible d'effectuer n'importe quelle tâche, mais après environ 5 à 10 secondes, la session est redémarrée et ils sont déconnectés.La session expire après le téléchargement du fichier

J'ai créé une page simple pour le démontrer. Pour exécuter cette page simple, créez un nouveau projet asp.net C#, puis insérez le code dans une nouvelle page.

EDIT: Cela semble être un problème IE7. Firefox et Chrome ne sont pas affectés.

je crois que le code responsable de la reprise de session est:

HttpContext.Current.Response.ContentType = "text/xml"; 
HttpContext.Current.Response.Clear(); 
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=test.xml"); 
HttpContext.Current.Response.Write("<test>this is a test.</test>"); 
HttpContext.Current.Response.End(); 

Pour recréer ce problème:

  1. Copiez le code ci-dessous dans une page asp.net.
  2. Utiliser IE (j'ai utilisé IE7, firefox et chrome ne semblent pas avoir ce problème)
  3. Notez que la session est nouvelle.
  4. Actualiser la page; remarquez que la session n'est pas nouvelle.
  5. Téléchargez le fichier et enregistrez-le.
  6. Appuyez sur le bouton "Actualiser la page" plusieurs fois jusqu'à ce que le texte "La session soit nouvelle" s'affiche de nouveau (environ 10 secondes).

Voici le code pour la récréation simple:

<%@ Page Language="C#" AutoEventWireup="true" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Untitled Page</title> 
</head> 
<body> 
    <script runat="server"> 
     private string sessionString { 
      get { 
       return HttpContext.Current.Session["sessionString"] == null ? null : HttpContext.Current.Session["sessionString"].ToString(); 
      } 
      set { 
       HttpContext.Current.Session["sessionString"] = value; 
      } 
     } 
     protected void Page_Load(object sender, EventArgs e) { 
      Label1.Text = sessionString ?? "Session is null"; 
      if(sessionString == null) { 
       Label1.Text = "Session is new"; 
       Label1.BackColor = System.Drawing.Color.Red; 
       sessionString = "Session is now not null"; 
      } 
      else { 
       Label1.Text = sessionString; 
       Label1.BackColor = System.Drawing.Color.White; 
      } 
     } 
     protected void LinkButton1_Click(object sender, EventArgs e) { } 
     protected void LinkButton2_Click(object sender, EventArgs e) { 
      HttpContext.Current.Response.ContentType = "text/xml"; 
      HttpContext.Current.Response.Clear(); 
      HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=test.xml"); 
      HttpContext.Current.Response.Write("<test>this is a test.</test>"); 
      HttpContext.Current.Response.End(); 
     } 
    </script> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Label id="Label1" runat="server" text="Label"></asp:Label> <br /> 
     <asp:LinkButton id="LinkButton1" runat="server" onclick="LinkButton1_Click">Refresh Page</asp:LinkButton> <br /> 
     <asp:LinkButton id="LinkButton2" runat="server" onclick="LinkButton2_Click">Download File</asp:LinkButton> <br /><br /> 
     <b>Steps to recreate:</b> 
     <ol> 
      <li>Download the file and save it.</li> 
      <li>Hit the "Refresh Page" button a couple of times until the "Session is new" text is redisplayed.</li> 
      <li>Answer my question explaining what the heck is going on!</li> 
     </ol> 
    </div> 
    </form> 
</body> 
</html> 

Répondre

2

Something to do with this (pourrait être un problème similaire)? Peut-être utiliser Fiddler pour voir ce qui se passe plus en détail dans le cookie.

+0

Même si ce n'est pas le cas, ça devrait l'être! – Robert

+0

Je ne sais pas si c'était exactement cela, mais après avoir réinstallé IE7 avec les dernières mises à jour, cela a bien fonctionné. Merci. – Chris

+0

C'est bien que ce soit corrigé. – RichardOD

0

Hm. Se pourrait-il que Response.Clear() mange le cookie de l'état de la session?

+0

Cela ne semble pas être le problème. Si vous commentez le code dans l'échantillon que j'ai donné, vous obtenez le même problème. – Chris

+0

... avec ou sans lait? –

1

Assurez-vous de commencer avec un FRESH BROWSER après vous être débarrassé de l'appel Response.Clear(). J'ai eu le même problème exact, lu ce post, et se débarrasser du Response.Clear() a fonctionné, mais seulement après que j'ai jeté le navigateur qui était ouvert sur mon bureau, et ai ouvert une nouvelle instance. bonne chance!

Questions connexes