首页 文章

ASP.NET站点自定义404错误被服务器错误阻止

提问于
浏览
2

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

  • 不重定向网址,

  • 在 Headers 中返回实际的404错误状态,

  • 记录URL,

  • 是我创建的自定义页面,

  • 并且是实际的操作/控制器页面而不是.aspx / .html页面 .

在Visual Studio中进行调试,它完美地运行 . 当我将其发布到我的测试或 生产环境 环境时,它不起作用并返回 Headers 中未找到404状态的通用文件 .

错误页面不是默认的404错误(this也不是this),但似乎是服务器本身的全局自定义(服务器托管多个站点,所有404显示相同的简单行页面) . 服务器上的错误页面实际显示500错误页面 . 而且,我've set Response.TrySkipIisCustomErrors = true to try to bypass it, but that doesn'吨工作 .

在 生产环境 和测试服务器上,它正在正确记录,如果我没有返回404状态代码,它将显示我的错误页面 . 因此,我非常确定动作/视图是否有效,但它与服务器有某种关系 . 它运行的是ASP.NET 4和IIS 7 .

有什么/哪里调查解决这个问题的建议?

.

Resources of code I've based my solution thus far on
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();
    }

2 回答

  • 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替换为自定义错误页面的路径 .

  • 0

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

相关问题