Отключить (вежливо) веб-сайт, когда сервер sql находится в автономном режиме.

StackOverflow https://stackoverflow.com/questions/88775

  •  01-07-2019
  •  | 
  •  

Вопрос

Я работаю в колледже и разрабатываю сайт ASP.NET со множеством отчетов о студентах, статистикой посещаемости...Основой данных является база данных сервера MSSQL, которая является серверной частью нашей системы управления студентами.У него есть регулярный период обслуживания по четвергам утром в течение неизвестного периода времени (в зависимости от того, что необходимо сделать).

Большинство сотрудников знают об этом, но менее постоянные пользователи, кажется, постоянно мне звонят.Каков самый простой способ отключить сайт во время обслуживания? Очевидно, я могу просто попробовать запрос к БД, чтобы проверить, работает ли он, но я не уверен, как лучше всего, например, перенаправить всех пользователей на сообщение «Веб-сайт не работает на техническое обслуживание», имея в виду, что они могли начать сеанс до закрытия веб-сайта.

Будем надеяться, что что-то можно реализовать глобально, а не на каждой странице.

Это было полезно?

Решение

Я бы предложил сделать это в Application_PreRequestHandlerExecute, а не после возникновения ошибки.Как правило, лучше не начинать обычную обработку, если вы знаете, что ваша база данных недоступна.Обычно я использую что-то вроде ниже

void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
 string sPage = Request.ServerVariables["SCRIPT_NAME"];
 if (!sPage.EndsWith("Maintenance.aspx", StringComparison.OrdinalIgnoreCase))
 {
  //test the database connection
  //if it fails then redirect the user to Maintenance.aspx
  string connStr = ConfigurationManager.ConnectionString["ConnectionString"].ConnectionString;
  SqlConnection conn = new SqlConnection(connStr);
  try
  {
   conn.Open();
  }
  catch(Exception ex)
  {
   Session["DBException"] = ex;
   Response.Redirect("Maintenance.aspx");
  }
  finally
  {
   conn.Close();
  }
 }
}

Другие советы

Поместите html-файл с именем «app_offline.htm» в корень вашего виртуального каталога.Просто как тот.

Скотт Гатри по теме и дружеским ошибкам.

Вы можете отобразить сообщение для вошедших в систему людей, в котором говорится: «Сайт будет закрыт на техническое обслуживание через xxx минут», а затем запустить службу для выхода всех из системы через xxx минут.Затем установите флаг где-нибудь, к которому может получить доступ каждая страница, и в верхней части каждой страницы (или только страницы шаблона) вы проверяете, установлен ли этот флаг, и если да, отправьте заголовок перенаправления на сайт, который не работает для страницы обслуживания.

Что происходит сейчас, когда сайт не работает и кто-то пытается на него зайти?Выдает ли ADO.NET определенное исключение, которое вы можете перехватить, а затем перенаправить на страницу «веб-сайт не работает»?

Вы можете добавить в проект файл «Global.asax», а в его код программной части добавить обработчик событий «Application_Error».Он будет срабатывать всякий раз, когда исключение генерируется и остается неперехваченным в любом месте вашего веб-приложения.Например, в С#:

protected void Application_Error(object sender, EventArgs e)
{
    Exception e = Server.GetLastError().GetBaseException();
    if(e is SqlException)
    {    
        Server.ClearError();
        Server.Transfer("~/offline.aspx");
    }
} 

Вы также можете проверить свойство Number в исключении, хотя я не уверен, какие числа будут указывать на невозможность подключения к серверу базы данных.Вы можете проверить это, пока он не работает, найти номер ошибки SQL и поискать его в Интернете, чтобы убедиться, что это именно то, что вы действительно хотите проверить.

РЕДАКТИРОВАТЬ: Я понимаю, о чем ты говоришь, Питобоб.

Страница «offline.html» не будет работать, если пользователь уже просматривал сайт или заходил на сайт через закладку/внешнюю ссылку на определенную страницу.

Решение, которое я использую, — создать второй веб-сайт с тем же адресом (IP или заголовком хоста), но по умолчанию он отключен.Когда веб-сайт не работает, сценарий деактивирует «настоящий» веб-сайт и вместо этого включает веб-сайт «обслуживания».Когда он снова подключается к сети, другой сценарий переключается обратно на «настоящий» веб-сайт.

Веб-сайт «обслуживания» расположен в другом корневом каталоге и имеет одну страницу с сообщением (и всеми необходимыми файлами изображений/css).

Чтобы одно и то же сообщение отображалось на любой странице, на веб-сайте «обслуживания» настраивается обработчик ошибок 404, который перенаправляет любой запрос на ту же страницу «веб-сайт не работает на техническое обслуживание».

Несколько более элегантный вариант проверки БД на каждой странице — это проверка файла Global.asax или создание главной страницы, от которой наследуются все остальные страницы.

Предложение иметь онлайн-сайт и автономный сайт действительно хорошо, но действительно применимо только в том случае, если у вас ограниченное количество сайтов, которыми нужно управлять на сервере.

РЕДАКТИРОВАТЬ: Блин, другие ответы с этими предложениями появились после того, как я загрузил страницу.Мне нужно не забыть обновиться перед ответом :)

Код Джеймса забывает закрыть соединение, вероятно, должно быть так:

try
{
   conn.Open();
}
catch(Exception ex)
{
   Session["DBException"] = ex;
   Response.Redirect("Maintenance.aspx");
}
finally
{
   conn.Close();
}

Спасибо за ответы. Я должен отметить, что не я занимаюсь обслуживанием и не имею постоянного доступа к IIS.Также я предпочитаю варианты, где я ничего не делаю, так как, как и все программисты, я немного ленив.

Я знаю один из способов — проверять флаг на каждой странице, но я надеюсь избежать этого.Могу ли я не сделать что-нибудь со страницей global.asax, на самом деле, я думаю, что публикация затронула мой мозг:

Думаю, я мог бы добавить в Application_BeginRequest немного кода, чтобы проверить состояние SQL, а затем перенаправить:

HttpContext context = HttpContext.Current;
     if (!isOnline())
     {
        context.Response.ClearContent();
        context.Response.Write("<script language='javascript'>" + 
"top.location='" + Request.ApplicationPath + "/public/Offline.aspx';</scr" + "ipt>");
     } 

Или что-то подобное может быть не идеальным, еще не проверено, поскольку я не на работе.Комментарии приветствуются.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top