Вы просто должны быть в состоянии отловить ошибку в методе Application_Error
в Global.asax
.Примерно так будет работать, хотя вы можете захотеть сделать проверку того, является ли исключение исключением, связанным с сеансом, более надежным.К сожалению, ASP.NET не генерирует SessionException, просто HttpException
, который включает SqlException
.
protected void Application_Error()
{
Response.Clear();
var ex = Server.GetLastError();
if (ex is HttpException &&
ex.Message.Contains("Unable to connect to SQL Server session database"))
{
Server.Transfer("/Maintenance.aspx");
}
else
{
Response.Write("Other error occurred.");
Response.Write(ex.ToString());
Response.End();
}
}
В Maintenance.aspx
, убедитесь, что вы установили директиву EnableSessionState
для false
.Вы можете использовать Server.Transfer
, чтобы предотвратить повторный запуск модуля Session для этого запроса и вызвать другое исключение.
EDIT
Выполнено небольшое тестирование, ивероятно, лучше использовать следующую проверку, чтобы проверить, не работает ли сеанс:
if (ex is HttpException && Context.Session == null)
Или, возможно, даже просто:
if (Context.Session == null)
Context.Session
всегда должен быть нулевым, если сеансмодуль не работает (к сожалению, я не могу найти документацию, подтверждающую это утверждение, но в моем тестировании это имело место).