2009-09-02 2 views
1

Когда пользователь загружает файл из моего приложения ASP.NET, сеанс истекает через несколько секунд после загрузки файла. До истечения срока действия сеанса, который может выполнять любую задачу, но примерно через 5-10 секунд сеанс перезапускается, и они выходят из системы.Сессия заканчивается после загрузки файла

Я создал простую страницу, чтобы продемонстрировать это. Чтобы запустить эту простую страницу, создайте новый проект asp.net C#, а затем вставьте код на новую страницу.

EDIT: Это, кажется, проблема IE7. Firefox и Chrome не затронуты.

Я считаю, что код отвечает за перезапуск сеанса связи:

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(); 

Чтобы воссоздать эту проблему:

  1. Скопируйте код в страницы asp.net.
  2. Использование IE (я использовал IE7, firefox и chrome, похоже, не имел этой проблемы)
  3. Обратите внимание, что сеанс является новым.
  4. Обновить страницу; обратите внимание, что сеанс не является новым.
  5. Скачайте файл и сохраните его.
  6. Несколько раз нажмите кнопку «Обновить страницу», пока текст «Сессия новый» не перерисовывается (около 10 секунд).

Ниже приведен код для простого отдыха:

<%@ 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> 

ответ

2

Something to do with this (может быть аналогичная проблема)? Может быть, использовать Fiddler, чтобы увидеть, что происходит более подробно с печеньем.

+0

Даже если это не так, должно быть! – Robert

+0

Я не знаю, было ли это так, но после переустановки ie7 с новейшими обновлениями он работал нормально. Благодарю. – Chris

+0

Хорошо, что он исправлен. – RichardOD

0

Hm. Может быть, Response.Clear() ест файл cookie сеанса?

+0

Это не проблема. Если вы прокомментируете код в примере, который я дал, вы получите ту же проблему. – Chris

+0

... с молоком или без него? –

1

Убедитесь, что вы начинаете с FRESH BROWSER после того, как избавились от вызова Response.Clear(). У меня была такая же проблема, прочитал этот пост и избавился от Response.Clear(), но ТОЛЬКО после того, как я бросил браузер, который сидел на моем рабочем столе, и открыл новый экземпляр. удачи!