【问题标题】:Disable (Politely) a website when the sql server is offlinesql server 离线时禁用(礼貌地)一个网站
【发布时间】:2010-09-10 11:12:40
【问题描述】:

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

大多数员工都知道这一点,但不太经常使用的用户似乎一直在给我打电话。什么是在维护期间禁用站点的最简单方法显然我可以尝试数据库查询来测试它是否已启动但我不确定将所有用户重定向到“网站因维护而关闭”消息的最佳方法,请记住,他们本可以在网站关闭之前开始会话。

希望可以在全局范围内而不是按页面实现某些东西。

【问题讨论】:

  • koff接受答案koff

标签: asp.net sql maintenance


【解决方案1】:

感谢到目前为止的回复,我应该指出,我不是负责维护的人,也没有一直访问 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>");
     } 

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

【讨论】:

    【解决方案2】:

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

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

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

    要在任何页面上显示相同的消息,“维护”网站设置了 404 错误处理程序,它将任何请求重定向到相同的“网站因维护而关闭”页面。

    【讨论】:

    • 实际上 app_offline 页面将在每个页面请求时进行评估。因此,如果它们已经在站点中,则下一页请求会将它们发送到 app_offline 页面。如果他们从外部网站深层链接,他们还会看到 app_offline 页面。
    • 实际上,当我发布那个时,我说的是“offline.html”,所以当时 ckarras 是绝对正确的。我的错。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      当网站关闭并且有人试图访问它时,现在会发生什么? 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 错误号并在线查找它是否是您真正想要检查的具体内容。

      编辑:我明白你在说什么,petebob。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          在每个页面上进行数据库检查的稍微更优雅的版本是在 Global.asax 文件中进行检查,或者创建一个所有其他页面都继承自的母版页。

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

              您可以向已登录的人显示一条消息,说“该站点将在 xxx 分钟后停机进行维护”,然后运行一项服务以在 xxx 分钟后将所有人注销。然后在每个页面都可以访问的地方设置一个标志,并在每个页面(或只是模板页面)的顶部测试是否设置了该标志,如果是,则将重定向标头发送到站点已关闭以进行维护页面。

              【讨论】:

                猜你喜欢
                • 2015-07-08
                • 2021-11-22
                • 2010-09-09
                • 1970-01-01
                • 2011-05-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-12-12
                相关资源
                最近更新 更多