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


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在请求处理周期中很早就得到了服务。


2565
2018-02-22 16:51


起源



答案:


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

话虽这么说,一个 HTTP 503 是不可用的服务错误。该 App_Offline.htm 使网站部分脱机,所有ASP.NET请求获得一个正常和正确 503 站点离线时的响应。

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

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

如果您的探测器正在呼叫 http://servername/monitor/ 如果没有指定任何页面,它将起作用。

你只需要删除它 - 就像删除你的那样 App_Offline - 维修后。


10
2018-03-10 17:02



JoeBilly,我认为通过检查你的答案,你会获得全部赏金,但看起来选择你的答案是不够的。因此,您的答案是自动选择的,您只获得了一半的赏金。不知道我做错了什么,但很遗憾你没有得到全部赏金。 - Johnny Oshika
别担心,这不是问题:)我不追逐赏金。如果您的信息:如果您未在7天内奖励您的赏金,则在至少2个赞成票开始的赏金之后创建的最高投票答案将被奖励一半的奖金金额(来自常见问题解答;))。 - JoeBilly
嗯,我仍然试图说服自己,这看起来不像我(之前)的答案...... - oleschri
你是对的oleschri。我的感觉是你的答案中遗漏了我的3个第一段。恕我直言,.htm技巧更多是一种解决方法,真正的答案是说App_Offline如何工作:然后提问者理解为什么“技巧”成为解决方案;)无论如何,请注意我在看到I后立即投了你的答案建议相同的解决方法;) - JoeBilly
这很酷。谢谢 :) - oleschri


答案:


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

话虽这么说,一个 HTTP 503 是不可用的服务错误。该 App_Offline.htm 使网站部分脱机,所有ASP.NET请求获得一个正常和正确 503 站点离线时的响应。

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

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

如果您的探测器正在呼叫 http://servername/monitor/ 如果没有指定任何页面,它将起作用。

你只需要删除它 - 就像删除你的那样 App_Offline - 维修后。


10
2018-03-10 17:02



JoeBilly,我认为通过检查你的答案,你会获得全部赏金,但看起来选择你的答案是不够的。因此,您的答案是自动选择的,您只获得了一半的赏金。不知道我做错了什么,但很遗憾你没有得到全部赏金。 - Johnny Oshika
别担心,这不是问题:)我不追逐赏金。如果您的信息:如果您未在7天内奖励您的赏金,则在至少2个赞成票开始的赏金之后创建的最高投票答案将被奖励一半的奖金金额(来自常见问题解答;))。 - JoeBilly
嗯,我仍然试图说服自己,这看起来不像我(之前)的答案...... - oleschri
你是对的oleschri。我的感觉是你的答案中遗漏了我的3个第一段。恕我直言,.htm技巧更多是一种解决方法,真正的答案是说App_Offline如何工作:然后提问者理解为什么“技巧”成为解决方案;)无论如何,请注意我在看到I后立即投了你的答案建议相同的解决方法;) - JoeBilly
这很酷。谢谢 :) - oleschri


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

我建议:

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

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

啊,为了纪念阿迪尔森关于搜索引擎的警告,只需添加一个 <meta name="robots" content="noindex"> 如果搜索引擎可以访问网站,请访问您的文件。


3
2018-03-09 16:28



很有意思。如何不将我的虚拟目录设为应用程序?我尝试了这种技术,但IIS仍然从root用户提供app_offline.htm文件。虽然我无法将虚拟目录与应用程序取消关联。 - Johnny Oshika
嗯,有趣的是,它适合我。刚尝试再试一次。该 Application settings 在标签中 Virtual Directory 和选项卡中的设置 ASP.NET 虚拟目录应该显示为灰色。这是你的设置吗? - oleschri


如果您正在使用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生命周期

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


2
2018-03-13 00:15



这看起来很有希望。我肯定会检查出来的。 - Johnny Oshika
有趣:)可能很难与App_Offline结合:App_Offline由ASP.NET管理(并重定向),我的猜测是IIS 7集成HttpModules可能不知道App_Offline行为?无论如何,你可以创建自己的模块,忘记App_Offline。我刚发现这个: blog.dreamlabsolutions.com/post/2009/09/02/... - JoeBilly
好吧,看看ASP.NET源代码(使用反射器)似乎没有实际的重定向,HttpRuntime本身(在实际加载HttpApplication之前)只是将文件写入响应流。进一步研究它,似乎是运行时 仍然 引发“OnPreSendRequestHeaders”和“OnPreSendRequestContent”事件,因此您仍然可以使用这些事件。我没有测试过(我这里没有安装IIS 7)但是如果你不想使用其他事件,你仍然应该检查BeginRequest和EndRequest是否作为集成管道的一部分触发。 - Linkgoron


你可以用 http重定向 在IIS级别。


1
2018-02-22 18:03



感谢Darin,但重定向将返回302状态代码。我想做的是返回200。 - Johnny Oshika


您可以处理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的页面...


0
2018-02-22 16:58



谢谢卢克。我认为这不会起作用,因为(根据ScottGu)微软在请求周期的早期和应用程序加载之前就实现了app_offline.htm逻辑,所以我不相信任何ASP.NET代码都会执行。 - Johnny Oshika


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

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

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


0
2018-03-07 03:32



感谢Adilson,但它似乎对我不起作用。我创建了一个HttpModule并订阅了BeginRequest事件。但是,如果app_offline.htm文件存在,它永远不会执行。我认为app_offline文件很早就在ASP.NET代码执行之前提供。如果你以某种方式让这个工作,你能分享你的代码吗?谢谢。 - Johnny Oshika
取消选中IIS中存在的验证文件 - smartcaveman