SQL Server가 오프라인일 때 웹 사이트를 (정중하게) 비활성화합니다.

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

  •  01-07-2019
  •  | 
  •  

문제

저는 대학에서 일하고 있으며 학생, 출석 통계에 대한 수많은 보고서가 포함된 ASP.NET 사이트를 개발해 왔습니다.데이터의 기반은 학생 관리 시스템의 백엔드인 MSSQL 서버 DB입니다.이것은 목요일 아침에 알 수 없는 기간 동안 정기적인 유지 관리 기간을 갖습니다(수행해야 하는 작업에 따라 다름).

대부분의 직원은 이 사실을 알고 있지만 덜 정기적인 사용자는 나에게 영원히 전화를 걸고 있는 것 같습니다.유지 관리 중에 사이트를 비활성화하는 가장 쉬운 방법은 무엇입니까? DB 쿼리를 시도하여 사이트가 작동 중인지 테스트할 수 있지만 예를 들어 모든 사용자를 "유지 관리를 위해 웹 사이트가 다운되었습니다" 메시지로 리디렉션하는 가장 좋은 방법은 확실하지 않습니다. 웹사이트가 다운되기 전에 세션을 시작할 수도 있다는 점을 염두에 두세요.

페이지 단위가 아닌 전역적으로 무언가를 구현할 수 있기를 바랍니다.

도움이 되었습니까?

해결책

오류가 발생한 후 대신 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();
  }
 }
}

다른 팁

"app_offline.htm"이라는 html 파일을 가상 디렉터리의 루트에 놓습니다.그렇게 간단합니다.

스콧 거스리 주제와 친숙한 오류에 대해.

로그인한 사람들에게 "xxx분 안에 유지 관리를 위해 사이트가 다운될 것입니다"라는 메시지를 표시한 다음 xxx분 후에 모든 사람이 로그아웃되는 서비스를 실행할 수 있습니다.그런 다음 모든 페이지가 액세스할 수 있는 위치에 플래그를 설정하고 모든 페이지(또는 템플릿 페이지만)의 상단에서 해당 플래그가 설정되어 있는지 테스트합니다. 설정된 경우 유지 관리 페이지를 위해 사이트가 다운된 사이트로 리디렉션 헤더를 보냅니다.

사이트가 다운되고 누군가가 사이트를 공격하려고 하면 이제 어떻게 되나요?ADO.NET에서 포착한 다음 "웹 사이트 다운" 페이지로 리디렉션할 수 있는 특정 예외를 발생시키나요?

프로젝트에 "Global.asax" 파일을 추가하고 해당 코드 숨김에 "Application_Error" 이벤트 핸들러를 추가할 수 있습니다.웹 앱 어디에서나 예외가 발생하고 포착되지 않을 때마다 실행됩니다.예를 들어 C#에서는 다음과 같습니다.

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 오류 처리기가 설정되어 있습니다.

모든 페이지에 대한 DB 검사의 좀 더 우아한 버전은 Global.asax 파일에서 검사를 수행하거나 다른 모든 페이지가 상속하는 마스터 페이지를 만드는 것입니다.

온라인 사이트와 오프라인 사이트를 갖는 제안은 정말 좋지만 서버에서 관리할 사이트 수가 제한된 경우에만 실제로 적용할 수 있습니다.

편집하다: 젠장, 페이지를 로드한 후에 이러한 제안이 포함된 다른 답변이 나타났습니다.답장하기 전에 새로고침하는 것을 기억해야 합니다 :)

James 코드는 연결을 닫는 것을 잊어버렸습니다. 아마도 다음과 같을 것입니다:

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