using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace Test
{
public class MyModule : IHttpModule
{
private void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(DateTime.Now.ToString() + "<br />");
HttpContext.Current.Response.Write(Now);
}
private string _Now = "";
private string Now
{
get
{
if (_Now == "")
{
_Now = DateTime.Now.ToString();
}
return _Now;
}
}
public void Init(HttpApplication Application)
{
Application.BeginRequest += (new EventHandler(Application_BeginRequest));
}
public void Dispose()
{
}
}
}
Почему строчка "HttpContext.Current.Response.Write(DateTime.Now.ToString() + "<br />");" возвращает текущее время, а строчка "HttpContext.Current.Response.Write(Now);" — время первого запроса?
Другими словами, то, что свойства и методы, судя по всему, кэшируются, мне очень сильно мешает.
Что можно сделать в такой ситуации?
Здравствуйте, flashion, Вы писали:
F>Объясните мне, что происходит:
Думаю, что происходит кеширование вашего хттп модуля. Т.е для прощессания разных реквестов используется один и тот же инстанс класса MyModule. А так как переменная _Now инициализируется при первом обращении, то и содержит она время первого реквеста.
Здравствуйте, flashion, Вы писали:
F>Другими словами, то, что свойства и методы, судя по всему, кэшируются, мне очень сильно мешает. F>Что можно сделать в такой ситуации?
Что-то я не понял. Ты сам же и сделал отложенную инициализацию своей переменной, а теперь пишешь, чтобы инициализировалось каждый раз. Переменная _Now у тебя будет проинициализирована при первом обращении, и далее всегда будет одно и тоже значение.
F>Спасибо!
Здравствуйте, flashion, Вы писали:
F>Почему строчка "HttpContext.Current.Response.Write(DateTime.Now.ToString() + "<br />");" возвращает текущее время, а строчка "HttpContext.Current.Response.Write(Now);" — время первого запроса?
Потому, что экземпляр каждого модуля создается ровно 1 на одно приложение.
F>Другими словами, то, что свойства и методы, судя по всему, кэшируются, мне очень сильно мешает. F>Что можно сделать в такой ситуации?
Исправить свои представления о действительности и написать код в соответствии с ними. Мне непонятно, чего именно ты хотел добиться своим кодом, поэтому предложить решение я не могу. Общий совет:
1. Определи, когда ты хочешь инициализировать данные, связанные с конкретным запросом.
2. Выбери подходящее событие в цикле жизни Application и в методе Init привяжи к нему инициализатор
3. Данные, относящиеся к запросу, храни в HttpContext.Items (эта коллекция специально сделана для обмена информацией между IHttpModule и IHttpHandler).
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Hello, "flashion" > Неужели никто с этим не сталкивался?
Потому, что instance модуля создается один раз (из расчета на instance
приложения). т.е. Now обновляется один раз а дальше, используется
запомненное значение.
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
IHttpModule и кэширование
От:
Аноним
Дата:
11.01.07 17:58
Оценка:
Потому что объект HttpModule не уничтожается между запросами. Соответственно в _Now записывается время первого запроса и потом оно уже не меняется.