IIS中特定资源的自定义http状态代码

IIS中特定资源的自定义http状态代码,http,iis,iis-7,Http,Iis,Iis 7,我有一个网站,只有一个“app_offline.htm”文件。如何配置IIS以返回特定状态代码(例如209)而不是默认状态代码(200)?由于IIS对网站根目录中名为“app_offline.htm”的文件有特殊处理,除非您重命名该文件,否则此建议可能无效。但是,不管怎样,它在这里 您可以为此使用HttpHandler。在web.config中,添加如下内容: <add name="app_offline_GET" path="app_offline.htm" verb="GET" typ

我有一个网站,只有一个“app_offline.htm”文件。如何配置IIS以返回特定状态代码(例如209)而不是默认状态代码(200)?

由于IIS对网站根目录中名为“app_offline.htm”的文件有特殊处理,除非您重命名该文件,否则此建议可能无效。但是,不管怎样,它在这里

您可以为此使用HttpHandler。在web.config中,添加如下内容:

<add name="app_offline_GET" path="app_offline.htm" verb="GET" type="namespace.classname,dllname" />
public void ProcessRequest(HttpContext context) {
  context.Response.WriteFile("app_offline.htm");
  context.Response.StatusCode = 209;        
  context.Response.StatusDescription = "whatever";
}
<configuration>
    <system.webServer>       
        <rewrite>
            <rules>
                <rule name="app_offline" stopProcessing="true">
                    <match url=".*" />
                    <action type="CustomResponse" statusCode="209" statusReason="System unavailable" statusDescription="The site is currently down for maintenance, or something." />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

使用ASP.Net的“app_offline.htm”功能的另一种选择是使用,它有一个自定义响应代码,设置自定义响应代码就是其中之一

如果页面内容不重要,则只需要响应代码,然后使用该模块,您可以配置一个规则,只要启用该规则,该规则将向任何请求返回带有209代码的空白响应

这将在您的web.config中体现为以下内容:

<add name="app_offline_GET" path="app_offline.htm" verb="GET" type="namespace.classname,dllname" />
public void ProcessRequest(HttpContext context) {
  context.Response.WriteFile("app_offline.htm");
  context.Response.StatusCode = 209;        
  context.Response.StatusDescription = "whatever";
}
<configuration>
    <system.webServer>       
        <rewrite>
            <rules>
                <rule name="app_offline" stopProcessing="true">
                    <match url=".*" />
                    <action type="CustomResponse" statusCode="209" statusReason="System unavailable" statusDescription="The site is currently down for maintenance, or something." />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

要基于状态代码显示特定内容,您可以让响应设置状态代码,并在httpErrors部分映射要基于代码显示的内容。参见本文中的示例

为了便于保存,我将复制以下示例:

<system.webServer>
    ...
    <rewrite>
        <rules>
            <rule name="SiteDown" stopProcessing="true">
                <match url=".*" />
                <action type="CustomResponse" statusCode="503" statusReason="Down for maintenance" statusDescription="will be back up soon" />
            </rule>
        </rules>
    </rewrite>

      <httpErrors existingResponse="Auto" errorMode="Custom" defaultResponseMode="File">
             <remove statusCode="503" subStatusCode="-1" />
             <error statusCode="503" path="503.html" />
      </httpErrors>
</system.webServer>

...

这不起作用,IIS仍然返回“503服务不可用”。这是正确的,因为您的处理程序是托管的,但“app_offline.htm”明确指示停止处理新请求,这样它们就不会命中代码。在您的情况下,是否无法更改文件名?如果没有,可能会有一个HttpModule(而不是一个HttpHandler)在处理序列中足够早地触发来完成该任务。无法使其工作。据我所知,该模块在请求进入ASP.NET管道之前工作。我开始觉得根本不可能做到:(是的,我给出的示例将通过返回一个带有209代码的空白响应来处理请求,而不会将其传递给ASP.Net。这就是您得到的结果,但不是您想要的行为吗?没错!ASP.Net总是返回app_offline.htm的内容,对于任何传入的请求,返回200代码。我需要覆盖它(自定义NLB场景).Ah好的,学到了一些新的东西。我从未使用过ASP.Net的这一功能。我所建议的方法实际上比使用app_offline.htm文件更有用,它可以激活一条规则,将209返回到所有请求,直到您希望站点恢复提供内容为止。