【问题标题】:ASP.NET site Custom 404 Error blocked by Server ErrorASP.NET 站点自定义 404 错误被服务器错误阻止
【发布时间】:2012-07-12 19:00:49
【问题描述】:

我有一个 MVC3 网站,我正在尝试正确显示 404 错误页面。我已经把它全部设置好了

  • 不重定向 URL,
  • 在标头中返回实际的 404 错误状态,
  • 记录 URL,
  • 是我创建的自定义页面,
  • 并且是实际的操作/控制器页面,而不是 .aspx/.html 页面。

在 Visual Studio 中调试,效果很好。当我将它发布到我的测试或生产环境时,它不起作用并返回一个找不到标题中的 404 状态的通用文件。

错误页面不是默认的 404 错误(thisthis),但似乎是服务器本身的全局自定义(服务器托管多个站点,所有 404 显示相同的简单行页面)。服务器上的错误页面实际上显示了一个 500 错误页面。另外,我设置了 Response.TrySkipIisCustomErrors = true 来尝试绕过它,但这不起作用。

在生产和测试服务器上,它被正确记录,如果我没有返回 404 状态代码,它会显示我的错误页面。因此,我很确定动作/视图正在工作,但它在某种程度上与服务器有关。它运行 ASP.NET 4 和 IIS 7。

有什么建议/在哪里调查以解决此问题?

到目前为止我的解决方案基于的代码资源
How can I properly handle 404 in ASP.NET MVC?

这是我在 Application_Error 中捕获异常的基础;我还是有点警惕它,因为它很容易导致循环,所以我尝试/捕获了一切以防止这种情况发生(错误发生在捕获另一个错误中)

global.asax 中的代码

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

            Response.Clear();

            HttpException httpException = exception as HttpException;

            RouteData routeData = new RouteData();
            routeData.Values.Add("controller", "Error");

            if (httpException == null)
            {
                routeData.Values.Add("action", "NotFound");
            }
            else
            {
                switch (httpException.GetHttpCode())
                {
                    case 404:
                        // Page not found.
                        routeData.Values.Add("action", "NotFound");
                        break;
                    case 500:
                        // Server error.
                        routeData.Values.Add("action", "ServerError");
                        break;


                    default:
                        routeData.Values.Add("action", "General");
                        break;
                }
            }

            routeData.Values.Add("error", exception);

            Server.ClearError();

            Response.TrySkipIisCustomErrors = true;

            IController errorController = new ErrorController();
            errorController.Execute(new RequestContext(
                 new HttpContextWrapper(Context), routeData));
        }
        catch
        {
            //
        }
    }

错误控制器中的代码

 public ActionResult NotFound()
    {
        try
        {

            Response.StatusCode = (int)HttpStatusCode.NotFound;
            Response.TrySkipIisCustomErrors = true;
        }
        catch
        {}
        return View();
    }

【问题讨论】:

    标签: asp.net asp.net-mvc-3 iis error-handling http-status-code-404


    【解决方案1】:

    我有同样的问题。应该修改 web.config 文件。

      <system.webServer>    
         <httpErrors errorMode="Custom" existingResponse="Replace">
            <remove statusCode="404" />
            <error statusCode="404" responseMode="ExecuteURL" path="/Errors/404" />
         </httpErrors>  
      </system.webServer>
    

    /Errors/404 替换为您的自定义错误页面的路径。

    【讨论】:

    • 我已经有了那套,但它不工作。在本地调试中,如果我摆脱了我的全局 application_error 函数,它不会做任何事情并显示默认的YSOD 404 error 并在服务器上显示一直显示在服务器上的 404 错误。我相信这是实际服务器的自定义 404 错误。
    • 附带说明:确保您的 404 路径正确。我遇到了一个问题,我的路径搞砸了,它默认回到另一个 404(我的 404 正在抛出 404 哈哈),所以我认为这个解决方案不起作用。仔细检查一下。
    • 我已经仔细检查过,因为了解我,所以我会输入错误。但这是正确的路径(复制/粘贴并在本地工作,但在测试环境中不起作用)我可能会看看我是否可以联系系统管理员查看它是否已启用 like this site shows
    【解决方案2】:

    您是否将TrySkipIisCustomErrors 指定为true?检查here

    【讨论】:

    • 我在 Application_error 函数中将其设置为 true,但它什么也没做。当它加载页面时,我还在控制器中设置它,以防设置没有延续,但这也不起作用。我已经更新了我的问题以反映这一点,并且我意识到显示的通用 404 错误不是 asp.net 的默认设置。它看起来是为服务器定制的,显示在服务器上托管的所有网站上。
    • 抱歉,花了一段时间,但我只是发布了我的代码。另外,我意识到(并且即使我不确定是否应该打开一个新问题也改变了)服务器抛出的错误(应该是 404)实际上有一个 500 状态码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2014-04-17
    • 1970-01-01
    • 2013-06-18
    • 2023-03-27
    • 2012-09-02
    相关资源
    最近更新 更多