asp.net - ASP.NET网站自定义404错误被服务器错误阻止

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

我有一个MVC3网站,并且正在尝试使404错误页面正确显示。我已经准备好了

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

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

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

    在生产和测试服务器上,它已正确记录,并且如果我没有返回404状态代码,它将显示我的错误页面。因此,我可以肯定操作/ View 可以正常工作,但是服务器可以通过某种方式实现。它正在运行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
            {
                //
            }
        }
    

    错误 Controller 中的代码
     public ActionResult NotFound()
        {
            try
            {
    
                Response.StatusCode = (int)HttpStatusCode.NotFound;
                Response.TrySkipIisCustomErrors = true;
            }
            catch
            {}
            return View();
        }
    

    最佳答案

    我遇到过同样的问题。应该修改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。

    关于asp.net - ASP.NET网站自定义404错误被服务器错误阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11461812/

    相关文章:

    c# - 允许在 SQL 事务期间读取?

    asp.net - Page.PreLoad 事件未显示在 visual studio 中

    c# - rc1.final 中的 User.Identity 中不存在 getUserId

    Javascript 文件加载不一致?

    java - 从 Java Servlet 模拟用户

    asp.net - 是否有针对 MS SQL 服务器的开源基于 Web 的管理?

    c# - 新的 ASP.NET MVC3 项目不能在 MonoDevelop 中编译

    asp.net-mvc-3 - 没有 Web.Config 连接字符串的 MVC3 模型

    asp.net-mvc-3 - 在 Azure 上的两个 ASP.NET MVC 3 应用程序之间共享数据库

    php - 如何通过本地主机在同一台 PC 上同时运行 Microsoft IIS 和 WAMP