提供HTTP状态代码的页面

时间:2019-06-11 13:47:32

标签: asp.net webforms http-status-code-404

我正在尝试为ASP.NET 4.5.2 Web窗体项目设置500和404页。当不存在的页面是.ASPX页面时,我可以使用404。 -我编写了用于提供自定义NotFound.aspx页面作为响应的代码。

当我使用Web.config为不存在的HTML页面提供404.html页面时,会发生我的问题。我的404.html页面在根文件夹中。如果我使用根文件夹中不存在的HTML页面进行测试,则404.html可以正确呈现。但是,如果我在不存在的子文件夹中使用不存在的HTML页面对其进行测试,则会提供404.html,但是CSS / JS路径不再正确吗?就像将CSS / JS路径视为与我在测试中指定的不存在的子文件夹相关?

Global.asax.cs:

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();

    if (ex != null && ex is HttpUnhandledException)
    {
        Server.ClearError();
        Server.Transfer("~/Error.aspx", true);
    }

    if (ex != null)
    { 
        var httpException = ex as HttpException; 
        if (httpException.GetHttpCode() == 404)
        {
            Server.ClearError();
            Server.Transfer("~/NotFound.aspx", true); 
        }
    }
}

Web.config:

<httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" />
    <error statusCode="404" path="404.html" responseMode="File" />
</httpErrors>

2 个答案:

答案 0 :(得分:0)

为CSS / JS路径使用绝对URL。例如,在您的404.html中(bootstrap和jquery只是示例):

<link href="/Content/bootstrap.min.css" rel="stylesheet" />
<script src="/Scripts/jquery-3.0.0.min.js"></script>
<script src="/Scripts/bootstrap.min.js"></script>

另一种设置是设置responseMode="Redirect"

<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" path="/Errors/404.html" responseMode="Redirect" />
</httpErrors>

在此示例中,404.html位于文件夹Errors中,并且URL可以是相对的:

<link href="../Content/bootstrap.min.css" rel="stylesheet" />
<script src="../Scripts/jquery-3.0.0.min.js"></script>
<script src="../Scripts/bootstrap.min.js"></script>

这将起作用,因为重定向URL不再相对于您所请求的URL。

答案 1 :(得分:0)

我能够如下解决它:

<httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" />
    <error statusCode="404" path="http://localhost/myproject/404.html"
        responseMode="File" />
</httpErrors>

关键要点是该版本必须能够使用绝对路径。因此,我的下一步是尝试以编程方式设置路径,以便在调试模式下将其转到本地,在发布模式下将其转到生产URL。我不想弄乱Web.config转换文件。

如果有人有进一步的信息,请放心。