当sql server脱机时,禁用(礼貌地)网站

时间:2008-09-17 23:52:01

标签: asp.net sql maintenance

我在一所大学工作,并且一直在开发一个ASP.NET网站,其中有许多关于学生的报告,出勤统计数据......数据的基础是MSSQL服务器数据库,它是我们学生管理系统的后端。这在周四早上有一个固定的维护期,持续时间不明(取决于必须做什么)。

大多数员工都知道这一点,但不那么规律的用户似乎永远都会让我振作起来。在维护期间禁用网站的最简单方法是什么,显然我可以尝试数据库查询来测试它是否已启动但不确定最好的方法,例如将所有用户重定向到“网站已关闭以进行维护”消息,请记住,他们本可以在网站关闭之前开始会议。

希望有些东西可以全局实现,而不是每页实现。

8 个答案:

答案 0 :(得分:12)

将名为“app_offline.htm”的html文件放入虚拟目录的根目录中。就这么简单。

Scott Guthrie关于主题和友好错误。

答案 1 :(得分:1)

您可以向已登录的用户显示一条消息,说明“该网站将在xxx分钟内停止维护”,然后运行服务以在xxx分钟后将所有人都记录下来。然后在每个页面可以访问的某个位置设置一个标志,并在每个页面的顶部(或仅模板页面)测试是否设置了该标志,如果是,则向维护页面发送重定向标头。

答案 2 :(得分:1)

如果用户已经在网站内导航,或者他正在从书签/外部链接访问网站,那么“offline.html”页面将无效。

我使用的解决方案是创建具有相同地址(IP或主机头)的第二个网站,但默认情况下禁用它。当网站关闭时,脚本会停用“真实”网站并启用“维护”网站。当它重新联机时,另一个脚本会切换回“真实”的网站。

“维护”网站位于不同的根目录中,其中包含一个包含消息的页面(以及任何所需的图像/ css文件)

要在任何页面上显示相同的消息,“维护”网站会设置一个404错误处理程序,该处理程序会将任何请求重定向到同一个“网站停止维护”页面。

答案 3 :(得分:1)

当网站关闭且有人试图点击它时,会发生什么? ADO.NET是否会抛出您可以捕获的特定异常,然后重定向到“网站关闭”页面?

您可以向项目添加“Global.asax”文件,并在其代码隐藏中添加“Application_Error”事件处理程序。每当从Web应用程序中的任何位置抛出异常并且未被捕获时,它都会触发。例如,在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错误编号并在线查找,看看它是否是您真正想要检查的内容。

编辑:我看到你在说什么,petebob。

答案 4 :(得分:1)

我建议在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();
  }
 }
}

答案 5 :(得分:0)

感谢您的答复到目前为止我应该指出我不是那个进行维护的人,也不是我一直都可以访问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>");
     } 

或者类似的东西可能不完美而没有经过测试,因为我不在工作。评论赞赏。

答案 6 :(得分:0)

每个页面上更优雅的数据库检查版本是检查Global.asax文件或创建所有其他页面继承的母版页。

建立在线网站和离线网站的建议非常好,但只有在服务器上管理的网站数量有限时才真正适用。

编辑:该死的,在我加载页面后,这些建议的其他答案出现了。我需要记住在回复之前刷新:)

答案 7 :(得分:0)

James代码忘记关闭连接,应该是:

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