Доступ к HttpApplicationState во время Session_End - PullRequest
0 голосов
/ 05 октября 2008

В моем приложении ASP.NET, использующем сеансы InProc, Session_End вызывает статический метод в другом объекте, чтобы выполнить очистку для конкретного сеанса. Эта очистка использует соединение с общей базой данных, которое я храню в состоянии приложения.

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

Я что-то упустил?

ОБНОВЛЕНИЕ : Похоже, мой вопрос нуждается в дополнительном разъяснении, поэтому позвольте мне попробовать следующий пример кода. То, что я хочу сделать, это:

// in Global.asax
void Session_End(object sender, EventArgs e) 
{
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup;
    nc.CleanUp();
}

Но проблема в том, что метод CleanUp, в свою очередь, нуждается в информации, которая хранится в состоянии приложения. Я уже делаю следующее, но это именно то, чего я надеялся избежать; это то, что я имел в виду под «... не передавая это ... как параметр методу очистки» выше.

// in Global.asax
void Session_End(object sender, EventArgs e) 
{
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup;
    nc.CleanUp(this.Application);
}

Мне просто не нравится идея, что Global.asax имеет , чтобы знать, откуда объект NeedsCleanup получает свою информацию. Подобные вещи, которые имеют больше смысла как самодостаточные в классе.

Ответы [ 3 ]

3 голосов
/ 06 октября 2008

Вы должны иметь доступ к объекту ApplicationState, используя свойство Application из Session_End.

void Session_End(object sender, EventArgs e) 
{
     HttpApplicationState state = this.Application;
}

(пришлось ответить другим, потому что у меня нет репутации, необходимой для прямого комментария)

1 голос
/ 05 октября 2008

Вы должны иметь доступ к объекту SessionState, используя свойство Session из Session_End.

void Session_End(object sender, EventArgs e) 
{
    HttpSessionState session = this.Session;
}

Это свойство и многое другое взято из базового класса Global.asax

0 голосов
/ 07 октября 2008

Где вы создаете экземпляры "NeedsCleanup"? Если он находится в Session_Start, то имеет смысл, чтобы ваш глобальный класс знал, как и когда создавать и уничтожать эти экземпляры.

Я понимаю, что вы хотите отделить очистку NeedsCleanup от вызывающей стороны. Возможно, более понятным способом было бы передать экземпляр «HttpApplication», найденный как в «HttpContext.Current.ApplicationInstance», так и в вашем глобальном классе через ссылку «this». В качестве альтернативы вы также можете указать любой из вышеупомянутых экземпляров в конструкции, который сделает очистку менее связанной.

...