Как обрабатывать событие запуска приложения в модуле ASP.NET

Я пишу HTTP-модуль asp.net, который должен читать данные конфигурации один раз из локального файла (скажем, config.xml, хранящегося в корневом каталоге приложения), а затем на основе конфигурации выполнять некоторую обработку входящих запросов.

Поскольку в модулях Asp.NET нет перехвата Application_Start/Application_init, как лучше всего справиться с этим сценарием. Я пытаюсь не читать файл конфигурации каждый раз, когда приходит запрос. В идеале я хочу читать файл конфигурации при запуске приложения.

Мне нужно кодировать это только в http-модуле и не хочу использовать Global.asax


person gauravphoenix    schedule 25.06.2010    source источник
comment
Почему бы вам не использовать статические переменные для этого? Статические средства для всех сессий.   -  person Tim Schmelter    schedule 25.06.2010
comment
Объекты статического класса инициализируются только при первом доступе, а не при запуске пула приложений IIS. Обработчик Application_Start лучше, если инициализация должна быть немедленной при запуске.   -  person spoulson    schedule 25.06.2010


Ответы (4)


Я бы выбрал простое свойство, что-то вроде этого...

public MyConfig Config
{
    get
    {
        MyConfig _config = Application["MyConfig"] as MyConfig;
        if (_config == null)
        {
            _config = new MyConfig(...);
            Application["MyConfig"] = _config;
        }
        return _config;
    }
}

таким образом вы просто получаете доступ ко всему, что вам нужно, из Config через свойство ...

int someValue = Config.SomeValue;

и он загружается в объект приложения, если он еще не был

Если вам нужна конфигурация для каждого пользователя, а не глобально, просто используйте Session["MyConfig"] вместо Application["MyConfig"]

person Antony Scott    schedule 01.07.2010

Не уверен, что это сработает, но вы можете реализовать это в модуле метод инициализации.

person Chris Van Opstal    schedule 25.06.2010
comment
Я только что попробовал. Кажется, что эти переменные/объекты и т. д. в методе Init недоступны в событиях HTTP-модуля, таких как Application_BeginRequest и т. д. - person gauravphoenix; 25.06.2010

В методе init вашего httpmodule вы можете подключиться к событию в контексте.

Например :

public void Init(HttpApplication context)
    {

        context.PostRequestHandlerExecute += (sender, e) =>
        {
            Page p = context.Context.Handler as Page;
            if (p != null)
            {
            ///Code here    
            }
        };
    }
person Richard Friend    schedule 25.06.2010
comment
только что заметил, что нет стартового события для подключения, почему бы просто не заполнить данные в методе инициализации вашего http-модуля... - person Richard Friend; 25.06.2010

статическая переменная сделала свое дело. вот код если кому интересно -

static string test; 
        public void Init(HttpApplication application)
        {


            application.BeginRequest +=(new EventHandler(this.Application_BeginRequest));
            test = "hi"; 
            application.EndRequest +=(new EventHandler(this.Application_EndRequest));


        }
       private void Application_BeginRequest(Object source,EventArgs e)
        {
            {
                HttpApplication application = (HttpApplication)source ;
                HttpContext context = application.Context;
                context.Response.Write(test);
            }


        }
person gauravphoenix    schedule 26.06.2010