无法在ASP.NET中为自定义错误页面返回HTTP状态404

时间:2016-09-02 12:10:57

标签: asp.net .net http-status-code-404 azure-web-sites custom-error-pages

我们的一个基于经典ASP.NET技术的遗留网站已迁移到新托管。现在它是运行Windows Azure Pack的云,我们的站点在.NET Framework 4.6.1下运行。

但是,我仍然无法为具有正确HTTP状态404的不存在的.aspx资源返回自定义错误页面 - 状态始终为302.最初,自定义404错误页面在web.config中定义如下:

<system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="/error/server-error.aspx">
        <error statusCode="404" redirect="/error/resource-not-found.aspx"/>
    </customErrors>
</system.web>

我确实阅读了this之类的SO帖子并尝试了建议的答案,包括将redirectMode设置为ResponseRewrite,但没有任何帮助或没有按预期工作。

我错过了什么,还是有其他解决方案?

3 个答案:

答案 0 :(得分:1)

  

但是,我仍然无法为具有正确HTTP状态404的不存在的.aspx资源返回自定义错误页面 - 状态始终为302.

据我所知,HTTP 302表示请求的资源已移至其他位置。根据您的描述,我创建了一个ASP.NET Web应用程序,并使用您提供的自定义错误配置将其部署到Azure Web App。

这是我的详细测试:

  1. 关闭CustomErrors的模式

    如果找不到您请求的资源,那么您可以通过浏览器中的Fiddler或开发者工具获得如下的响应标题。

  2. 将CustomErrors的模式设置为RemoteOnly

    使用您提供的配置,当找不到所请求的资源时,您可以按如下方式获取详细信息:

  3. 经过测试,我已经在我的身边和Azure Web App上成功测试过。 当您通过Fiddler获得302响应时,请尝试检查位置标题。此外,如果您希望在找不到资源并且浏览器将重定向到包含404状态代码的resource-not-found.aspx页面时,您可以遵循此相关thread

答案 1 :(得分:1)

我设法克服了这个问题。首先,我关闭了web.config中错误404的重定向:

<system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="/error/server-error.aspx">
        <!-- <error statusCode="404" redirect="/error/resource-not-found.aspx"/> -->
    </customErrors>
</system.web>

然后我将以下Application_Error事件处理程序添加到我的Global.asax:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    Dim serverError As HttpException = DirectCast(Server.GetLastError(), HttpException)

    If Not serverError Is Nothing Then
        If 404 = serverError.GetHttpCode() Then
            Server.ClearError()
            Server.Transfer("/error/resource-not-found.aspx")
        End If
    End If
End Sub

最后,我将下面的行添加到我的错误404. page(resource-not-found.aspx):

Sub Page_Load()
    ' If you're running under IIS 7 in Integrated mode set,
    ' use this line to override IIS errors:
    Response.TrySkipIisCustomErrors = True

    Response.StatusCode = 404
    Response.StatusDescription = "Page not found"
End Sub

仅供参考:如果您使用MasterPage技术,则只会重定向MasterPage的可变部分。在我们网站的各个部分中使用不存在的资源后,我发现这种行为对我们的最终用户来说很聪明且有用。

还有一件事。要返回非ASPX资源的HTTP 404状态代码,我在web.config中使用以下设置:

<system.webServer>
    <httpErrors errorMode="Custom" defaultResponseMode="Redirect">
        <remove statusCode="404"/>
        <error statusCode="404" path="/error/resource-not-found.aspx" responseMode="ExecuteURL"/>
    </httpErrors>
</system.webServer>

请注意针对错误404设置为'ExecuteURL'的responseMode。

答案 2 :(得分:0)

我没有用.aspx做过很多 我只是在谷歌上搜索,我想知道你是否有

<% Response.StatusCode = 404 %>
你在404.aspx页面上的