2016-05-31 3 views
1

Я не поддерживаю потоки или сеанс, однако определенные переменные теряются во время обратной передачи, потому что создается новый поток. Мысли?ASP.NET Postback создает новый поток и новый сеанс

currentthreadid и sessionid изменяются каждый раз при нажатии кнопки button1 или button2. Меня больше беспокоит создание новых потоков. Помоги пожалуйста !

вот мой WebForm1.aspx код

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="UpdatePanelTest2.WebForm1" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server"></asp:ScriptManager> 
     <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
      <ContentTemplate> 
       <asp:Label ID="Label1" runat="server" Text="Before Click" /> 
       <asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button1_Click" CausesValidation="false"/> 
      </ContentTemplate> 
      <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" /> 
      </Triggers> 
     </asp:UpdatePanel> 
     <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button2_Click"/> 
    </form> 
</body> 
</html> 

вот мой WebForm1.aspx.cs код

namespace UpdatePanelTest2 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

      string currentthreadid = AppDomain.GetCurrentThreadId().ToString(); 
      string sessionid = Session.SessionID; 

      if (IsPostBack) { } 
      if (IsAsync) { } 
      if (IsPostBackEventControlRegistered) { } 

      if (ScriptManager1.IsInAsyncPostBack) { } 
     } 

     protected void Page_Init(object sender, EventArgs e) 
     { 

     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
      this.Label1.Text = "After Click"; 
     } 

     protected void Button2_Click(object sender, EventArgs e) 
     { 

     } 
    } 
} 

мой файл web.config

<?xml version="1.0"?> 

<!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> 

<configuration> 
    <system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 

</configuration> 

UPDATE

Причина мне это нужно, чтобы быть такой же поток для обратной передачи вызовов, потому что я поддерживать определенные переменные, а затем повторно использовать эти переменные для текущего потока пула

код:

private static readonly ThreadLocal<PageContext> _context = new ThreadLocal<PageContext>(typeof(PageContext), "_context", true); 
     private string[] _path; 

     public static PageContext ForCurrentThread 
     { 
      get { return _context.Value ?? (_context.Value = new PageContext()); } 
     } 

public void Initialize(HttpRequest _request) 
     { 
somestring = null; 
} 

public string somestring { get; set; } 

Когда страница загружает первый раз, somestring получает значение, другие классы используют тот же контекст и повторно используют это значение somestring. Это не работает, если для запросов обратной передачи создается новый поток.

+0

не может понять ваш вопрос. Вы хотите сохранить ценность только один раз? –

+0

Существует аналогичная тема - пожалуйста, следуйте ниже ссылки. http://stackoverflow.com/questions/222999/how-to-persist-variable-on-postback – meghlashomoy

+0

В какой переменной вы хотите остаться прежней? – smoksnes

ответ

2

Это по дизайну. SessionID не будет сохранен до фактического использования.

https://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx

При использовании куков на основе состояния сеанса, ASP.NET не выделяет хранилища для данных сеанса до тех пор, пока используется объект сеанса. В качестве результата для каждого запроса страницы создается новый идентификатор сеанса до тех пор, пока не будет получен доступ к объекту сеанса .

Если добавить это к вашей коде SessionID останется прежняя:

Session["foo"] = 1; 

ASP.Net не будет гарантировать вам, чтобы получить тот же поток для каждого запроса. Приложение работает с несколькими потоками, и оно будет извлекать поток из потока и использовать его для обработки запроса.

Я бы сказал, что это не о чем беспокоиться.

Я бы не хотел хранить вещи для конкретной темы. Невозможно узнать, хотите ли вы получить тот же поток при следующем запросе. Не следует ли хранить значение для конкретного пользователя (например, сеанс)?

public static PageContext ForCurrentSession 
{ 
    get 
    { 
     if(Session["PageContext"] == null) 
     { 
      Session["PageContext"] = new PageContext(); 
     } 
     return Session["PageContext"] as PageContext; 
    } 
} 
+0

Спасибо! Я думаю, что весь этот подход ошибочен ...если я использую сеансы, то в балансированной среде мне нужна БД. Я изменю способ его работы. текстовые переменные как файлы cookie и статические коллекции/списки ... –

+0

Да, я думаю, что это хороший idéa. У Hanselman есть хороший блог о сеансе и нескольких серверах. http://www.hanselman.com/blog/LoadBalancingAndASPNET.aspx – smoksnes

+0

ASP.Net даже не гарантирует, что один запрос будет обрабатываться одним потоком - он может переходить между потоками при запуске событий жизни страницы, а если обработчик запросов асинхронен (устаревший стиль или 'async' /' await'). –

Смежные вопросы