禁用(礼貌)网站当SQL服务器脱机

问题描述 投票:3回答:8

我在大学工作,并一直在开发一个ASP.NET网站,查看有关学生很多,很多报告,考勤统计...对数据的依据是MSSQL数据库服务器是后端到我们的学生管理系统。这对星期四上午的时间未知长度的常规保养周期(取决于什么必须做)。

大部分工作人员都知道这一点,但不太普通用户似乎永远给我打电话。什么是维护期间停用的网站很明显,我可以只尝试DB查询,以测试其是否在运行,但我不能确定为实例的所有用户重定向到一个最好的方式“该网站停机维护”消息最简单的方法,铭记他们可以在网站之前启动一个会话下去。

希望能找到一些全球范围内实施,而不是每个页面。

asp.net sql maintenance
8个回答
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();
  }
 }
}

12
投票

掉落名为“app_offline.htm”一个HTML文件到您的虚拟目录的根目录。就那么简单。

Scott Guthrie主体和友好的错误。


1
投票

您可以显示一条消息的人谁已经在说:“该网站将关闭在XXX分钟维护”的记录,然后运行服务XXX分钟后,登录大家出来。然后设置一个标志的地方,每一页都可以访问,并在每个页面(或只是模板页)你测试,如果该标志被设置,如果是顶部,发送一个重定向头到网站正在维护页。


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。


1
投票

如果用户已经在网站内航行,如果他访问该网站从一个书签/外部链接到一个特定的页面中的“offline.html”页面将无法正常工作,或。

我使用的解决方案是创建第二个网站使用相同的地址(IP或主机头(S)),但有它默认是禁用的。当网站已关闭,脚本停用“真实”的网站,并启用了“维修”的网站来代替。当它重新联机,另一个脚本切换回“真正”的网站。

“维持”网站是位于不同的根目录下,用与该消息的单个页面(和任何所需的图像/ CSS文件)

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


0
投票

在每一页上的DB检查稍微更优雅版是做检查Global.asax文件或创建一个母版页,所有的其他页面继承。

有一个网站和离线站点的建议是非常好的,但只有真正适用,如果你有数量有限的网站管理服务器上。

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


0
投票

詹姆斯码忘记关闭连接,也许应该是:

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

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>");
     } 

或者,正如我不是在工作中类似的东西可能不是完美的没有测试呢。评论表示赞赏。

© www.soinside.com 2019 - 2024. All rights reserved.