我在大学工作,并一直在开发一个ASP.NET网站,查看有关学生很多,很多报告,考勤统计...对数据的依据是MSSQL数据库服务器是后端到我们的学生管理系统。这对星期四上午的时间未知长度的常规保养周期(取决于什么必须做)。
大部分工作人员都知道这一点,但不太普通用户似乎永远给我打电话。什么是维护期间停用的网站很明显,我可以只尝试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文件到您的虚拟目录的根目录。就那么简单。
Scott Guthrie主体和友好的错误。
您可以显示一条消息的人谁已经在说:“该网站将关闭在XXX分钟维护”的记录,然后运行服务XXX分钟后,登录大家出来。然后设置一个标志的地方,每一页都可以访问,并在每个页面(或只是模板页)你测试,如果该标志被设置,如果是顶部,发送一个重定向头到网站正在维护页。
现在会发生什么时,该网站已关闭,并有人试图打它?请问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。
如果用户已经在网站内航行,如果他访问该网站从一个书签/外部链接到一个特定的页面中的“offline.html”页面将无法正常工作,或。
我使用的解决方案是创建第二个网站使用相同的地址(IP或主机头(S)),但有它默认是禁用的。当网站已关闭,脚本停用“真实”的网站,并启用了“维修”的网站来代替。当它重新联机,另一个脚本切换回“真正”的网站。
“维持”网站是位于不同的根目录下,用与该消息的单个页面(和任何所需的图像/ CSS文件)
有任何页面上显示的相同的消息,“维护”网站设置了一个404错误处理程序将重定向到相同的任何要求“网站正在维护中”的页面。
在每一页上的DB检查稍微更优雅版是做检查Global.asax文件或创建一个母版页,所有的其他页面继承。
有一个网站和离线站点的建议是非常好的,但只有真正适用,如果你有数量有限的网站管理服务器上。
编辑:妈的,其他的答案与这些建议提出了我加载页面后。我需要记住回答之前刷新:)
詹姆斯码忘记关闭连接,也许应该是:
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>");
}
或者,正如我不是在工作中类似的东西可能不是完美的没有测试呢。评论表示赞赏。