IHttpModule и кэширование
От: flashion  
Дата: 11.01.07 16:54
Оценка:
Объясните мне, что происходит:



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);" — время первого запроса?

Другими словами, то, что свойства и методы, судя по всему, кэшируются, мне очень сильно мешает.
Что можно сделать в такой ситуации?

Спасибо!
Re: IHttpModule и кэширование
От: flashion  
Дата: 11.01.07 17:47
Оценка:
Неужели никто с этим не сталкивался?
Re: IHttpModule и кэширование
От: kostya.misura  
Дата: 11.01.07 20:12
Оценка:
Здравствуйте, flashion, Вы писали:

F>Объясните мне, что происходит:


Думаю, что происходит кеширование вашего хттп модуля. Т.е для прощессания разных реквестов используется один и тот же инстанс класса MyModule. А так как переменная _Now инициализируется при первом обращении, то и содержит она время первого реквеста.
Re: IHttpModule и кэширование
От: Mika Soukhov Stock#
Дата: 11.01.07 20:16
Оценка:
Здравствуйте, flashion, Вы писали:

F>Другими словами, то, что свойства и методы, судя по всему, кэшируются, мне очень сильно мешает.

F>Что можно сделать в такой ситуации?

Что-то я не понял. Ты сам же и сделал отложенную инициализацию своей переменной, а теперь пишешь, чтобы инициализировалось каждый раз. Переменная _Now у тебя будет проинициализирована при первом обращении, и далее всегда будет одно и тоже значение.

F>Спасибо!


Не за что.
Re: IHttpModule и кэширование
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.01.07 04:58
Оценка:
Здравствуйте, 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
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: IHttpModule и кэширование
От: TK Лес кывт.рф
Дата: 12.01.07 09:31
Оценка:
Hello, "flashion"
> Неужели никто с этим не сталкивался?

Потому, что instance модуля создается один раз (из расчета на instance
приложения). т.е. Now обновляется один раз а дальше, используется
запомненное значение.
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
IHttpModule и кэширование
От: Аноним  
Дата: 11.01.07 17:58
Оценка:
Потому что объект HttpModule не уничтожается между запросами. Соответственно в _Now записывается время первого запроса и потом оно уже не меняется.

( Блог программиста )


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.