2

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

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

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

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

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

关于什么/在哪里调查以解决此问题的任何建议?

.

到目前为止,我的解决方案基于
如何在 ASP.NET MVC 中正确处理 404?

这是我通过在 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();
    }
4

2 回答 2

0

您是否指定了TrySkipIisCustomErrorsas true在这里检查。

于 2012-07-13T03:45:33.287 回答
0

我遇到过同样的问题。应修改 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替换为自定义错误页面的路径。

于 2012-07-12T23:17:17.493 回答