Как отловить ошибки соединения для состояния сеанса, когда он использует SQL для хранения сеанса? - PullRequest
4 голосов
/ 12 июля 2011

У нас есть приложение ASP.NET, которое использует SQL Server для хранения своего состояния сеанса.Это прекрасно работает, за исключением случаев, когда это не так;)

Наши серверы баз данных размещаются сторонними производителями, и они периодически выполняют обслуживание на сервере SQL.Когда это происходит, мы хотим, чтобы наш код корректно обнаруживал ошибки подключения к БД и отображал дружественное сообщение о том, что мы находимся на обслуживании.Мы написали HttpModule, который запускается с каждым запросом и создает экземпляр нашего контейнера Entity Framework.Если создание экземпляра завершается неудачей по какой-либо причине, мы знаем, что существуют проблемы с подключением, и мы перенаправляем пользователя на страницу обслуживания.

Это работает нормально, пока мы не включим настройку сервера состояний сеанса.Состояние сеанса обращается к строке подключения до запуска этого модуля.Затем мы получаем ужасную ошибку соединения для состояния сеанса.

Как мы можем отловить эту ошибку?Есть ли место в нашем приложении, где мы можем отлавливать / обнаруживать ошибки подключения к состоянию сеанса и переключаться в состояние сеанса «в процессе»?

1 Ответ

10 голосов
/ 12 июля 2011

Вы просто должны быть в состоянии отловить ошибку в методе 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 всегда должен быть нулевым, если сеансмодуль не работает (к сожалению, я не могу найти документацию, подтверждающую это утверждение, но в моем тестировании это имело место).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...