题
我工作在一个大学和一直在发展一个ASP.NET 现场有许许多多的报告,关于学生出勤率统计数据...基础数据的一个数据库服务器数据库,这是结束我们的学生管理系统。这有一个定期维修期间在星期四上午对一个未知的时间长度(取决于什么要做).
大多数工作人员都意识到这一点,但较不经常用户似乎是永远响我。什么是最简单的方法来禁止的网站的维护期间很明显我可以尝试一个数据库查询,以试验,如果它是了但我不能确定的最佳方式,例如向所有用户"网站下为维护"的信息,同时铭记,他们可能已经开始一届会议之前在网站下去。
我们希望,东西可以实现全球,而不是每页。
解决方案
我建议这样做在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"进入根目录的虚拟目录。就这么简单。
斯科特*格思里 在主题和友好的错误。
你可以显示一个消息的人必须登录在说"该网站将关闭进行维护在三十分钟",那么运行服务,以记录每个人都出后的三十分钟。然后设置标志的地方,每一页上可以访问,并在每页(或只是模板页)你如果测试,标志设置,如果是,发送一个重定向头一个网站关闭进行维护的网页。
什么现在会发生时,该网站下来,有人试图打它?做ADO.NET 扔一个具体的例外,你能赶上然后重新定向于在"网站下"页面?
你可以添加一个"全球性的。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");
}
}
你也可以检查的数量的财产上的例外,虽然我不确定其数量(s)将表明它无法连接的数据库服务器。你可以测试这一切,而它下来,找到SQL错误的数量和在线查看看如果它是具体什么你真的想要检查。
编辑: 我看到你在说什么,petebob.
该"offline.html"页面不会工作如果用户已经导航网站内,或者如果他访问该网站,从一个书签/外部链接到一个特定的网页。
该解决方案我用的是创建的第二个网站具有相同的地址(IP或主header(s)),但它无障碍的默认。当该网站是下一个脚本停用的"真正的"网站并使得能够"维护"的网站,代替。当它回来的在线,另一个剧本开关回到"真实"的网站。
"维持"网站位于不同的根本目录,与一个单页的信息(和所需的任何图像/css文件)
有相同的消息显示在任何网页上,在"维护"的网站是设立一个404错误的处理程序,将任何请求以同样的"网站下为维护"页面。
一个稍微更加优雅版本的数据库检查每一页上将要做的检查,在全球性的。asax文件或建立一个主页,所有其他页面继承。
该建议具有一个网站和一个脱机场是真的很不错,但只有真正适用,如果你有一个数量有限的网站管理的服务器。
编辑: 该死,其他的答案与这些建议来后我加载的页。我需要记得刷新之前作出答复:)
詹姆斯*代码忘记关闭连接,可能应该是:
try
{
conn.Open();
}
catch(Exception ex)
{
Session["DBException"] = ex;
Response.Redirect("Maintenance.aspx");
}
finally
{
conn.Close();
}
谢谢你的回复到目前为止,我应指出我不是那个不维护,也不我有权访问所有的时间来IIS。还有,我更喜欢选择在那里我做什么,因为喜欢所有的程序员,我有点懒.
我知道一个方法是检查一个标志在每一页上的但是我希望能够避免它。我可以不做一些与全球性的。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>");
}
或者类似的东西,也许不是完美的未经测试,但我没在工作。评论的赞赏。