2

我有一个MVC3的网站,我试图让404个错误页面正确显示。我知道了所有的设置,它ASP.NET站点自定义404错误阻止服务器错误

  • 不重定向的URL,
  • 返回头实际的404错误状态,
  • 登录的网址,
  • 是一个自定义的页面我已经创建,
  • 和是一个实际的动作/控制页,而不是一个的.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(); 
    } 

回答

0

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

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

更换/错误/ 404与您的自定义错误页的路径。

+0

我已经有了这个设置,但它不工作。在本地调试时,如果我摆脱了我的全局application_error函数,它不会执行任何操作并显示默认的[YSOD 404错误](http://static.colinmackay.co.uk/images/mvc/2011-05- 13-Step-4-Resource-not-found-ysod.png),并且在服务器上它显示服务器上404一直出现的错误。我相信这是实际服务器的自定义404错误。 – Helba 2012-07-13 14:23:41

+0

正如旁注:确保你的404路径是正确的。我遇到了一个问题,我把我的路径搞砸了,它默认回到其他404(我的404正在抛出404的哈哈),所以我认为这个解决方案不起作用。请仔细检查一下。 – Saedeas 2012-07-13 14:31:13

+0

我已经加倍检查,因为知道我,我会输错它。但它是正确的路径(复制/粘贴和在本地工作,但在测试环境中不起作用)我可能会看到是否可以联系系统管理员以查看它是否已启用,但[如本网站所示](http:// tedgustaf.com/en/blog/2011/5/custom-404-and-error-pages-for-asp-net-and-static-files/) – Helba 2012-07-13 14:38:45

0

你有没有指定的TrySkipIisCustomErrorstrue?检查here

+0

我已经在Application_error函数中设置为true,并且它没有'不要做任何事情。当它加载页面时,我也将其设置在控制器中,以防设置没有结束,但这也不起作用。我已经更新了我的问题以反映这一点,并且我意识到显示的通用404错误不是asp.net的默认值。它看起来是服务器的自定义服务器,显示了服务器上托管的所有网站。 – Helba 2012-07-13 14:18:54

+0

你能发布你的完整代码吗? – VJAI 2012-07-13 14:52:43

+0

对不起,花了一段时间,但我只是发布我的代码。此外,我意识到(并且即使我不确定是否应该打开一个新问题也改变了)服务器抛出的错误(404应该是什么)实际上有一个500状态码。 – Helba 2012-07-17 22:00:42