在为特定URL提供app_offline.htm时,将http状态503更改为200

时间:2011-02-22 16:51:49

标签: asp.net asp.net-mvc iis iis-7 app-offline.htm

ASP.NET服务的app_offline.htm文件返回http状态503.这是大多数情况下的正确行为。但是,在请求特定URL的情况下(例如https://www.mywebsite.com/monitor),我想将返回的http状态更改为200,同时在所有其他情况下仍返回http状态503。这可能吗?

我之所以这样做是因为每当我们在我们的网站上进行定期维护时,我们都会使用app_offline.htm文件,但我们不希望我们的正常运行时间监控服务(Pingdom.com)在我们的预定时间内报告停机时间维护。

我认为这必须在IIS级别,因为app_offline.htm在请求处理周期中很早就会得到服务。

6 个答案:

答案 0 :(得分:10)

请注意,App_Offline仅用于将ASP.NET部分关闭,它与IIS站点无关。所有非ASP.NET请求类似.htm-将通过正常的IIS管道。

话虽如此,HTTP 503是不可用的服务错误。 App_Offline.htm使网站部分脱机,当网站脱机时,所有ASP.NET请求都会收到503响应,这是正常且正确的。

使用HttpModule绕过它,或者ASP.NET管道中的任何代码都不是有效的解决方案。

由于您在维护期间已经在IIS根目录中创建/复制App_Offline.htm,因此我建议您将maintenance.htm添加为/monitor文件夹或IIS的默认文档站点并在维护期间在其中创建/复制maintenance.htm文件:然后,无论ASP.NET站点是否脱机,都将访问默认页面。

如果您的探针在没有指定任何页面的情况下调用http://servername/monitor/ uri,它将起作用。

您只需删除它 - 就像您在维护后删除App_Offline一样。

答案 1 :(得分:3)

据我所知,app_offline.htm逻辑在ASP.NET 2.0模块中处理,但在任何应用程序加载开始之前(这当然是app_offline.htm * g *背后的想法)。

我建议:

  • 将名为monitor的虚拟目录添加到(已禁用)网站的根目录,并将其分配给某个IIS可读文件夹。
  • 不要将虚拟目录设置为应用程序,因此ASP.NET应该保留该文件夹。
  • 例如将app_offline.htm文件的副本重命名为default.htm(或默认文件名列表中的任何内容)到该文件夹​​中。

这样,当访问https://www.mywebsite.com/monitor时,IIS应该为html文件提供200响应。

啊,为了纪念Adilson对搜索引擎的警告,只需在您的文件中添加<meta name="robots" content="noindex">,以防搜索引擎访问该网站。

答案 2 :(得分:2)

如果您正在使用IIS 7和集成管道,您仍然可以为不属于ASP.NET管道的请求创建HttpModule,即i / e .Htm请求。

http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis7-integrated-pipeline/

ASP.NET IIS 7 lifecycle

http://learn.iis.net/page.aspx/121/iis-7-modules-overview/

答案 3 :(得分:0)

您可以处理Global.asax Application_Error方法,识别您的网址,识别您的错误,重定向到您的网页

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim ctx = HttpContext.Current
        dim myerror = ctx.Error
        If HttpContext.Current.Request.Path = "mypath" Then
            HttpContext.Current.Response.Redirect("~/mydestpage.aspx")
        End If
    End Sub

这将首先返回先前请求的302,然后重定向到显示200 ...

的页面

答案 4 :(得分:0)

您可以在IIS级别使用http redirect

答案 5 :(得分:0)

嘿,伙计。这样做时要小心! 200响应可以让您的错误页面被谷歌和其他搜索引擎编入索引。

如果您仍然选择这样做,我认为您应该创建一个HttpModule,并将其放在模块堆栈的顶部。此模块必须测试App_offline.html文件是否存在,如果存在,则测试该请求是否来自站点监视器。在这种情况下,您可以使用200响应,否则,响应代码必须为503以避免错误的站点索引。

重要提示:您的站点应用程序池必须处于集成模式。