MVC3自定义错误页面在dev中工作,而不是在服务器上

时间:2012-01-04 18:35:42

标签: asp.net-mvc-3 iis windows-server-2008

我正在使用此SO Question中详述的解决方案。我以前在其他网站上使用过它并且工作正常,它可以在我的开发盒上运行。但是,当我发布到Windows VPS时,错误会返回标准的IIS错误页面。

我之前从未管理过Web服务器,我不确定需要检查哪些设置才能弄清楚为什么它没有返回我设置的自定义错误。我已经尝试将应用程序的.net错误页面设置为关闭和打开,默认页面设置为根站点,以及只是'/'。

我也尝试将错误页面(在7.5中的iis下)设置为自定义和详细。

这些似乎都不会对返回的错误页面产生任何影响。我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

我记得有类似的问题,我在代码

中添加了这一行
 protected void Application_Error()
 {
 var exc = Server.GetLastError();
 var httpExc = exc as HttpException;
 Response.Clear();
 Server.ClearError();
 var routeData = new RouteData();
 routeData.Values["controller"] = "Error";
 routeData.Values["action"] = "General";
 routeData.Values["exception"] = exc;
 Response.StatusCode = 500;
 if (httpExc != null)
 {
     Response.StatusCode = httpExc.GetHttpCode();
     routeData.Values["action"] = "Http404";
     routeData.Values["exception"] = httpExc;
 }
 Response.TrySkipIisCustomErrors = true; //this fixed it
 IController errorsController = new WWS_Website.Controllers.ErrorController();
 var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
 errorsController.Execute(rc);

 }

答案 1 :(得分:0)

您可以使用web.config文件的system.webServer部分中的httpErrors部分替换标准IIS错误页面。这是system.web中customErrors部分的补充。

<system.webServer>
    ...
    <httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
        <remove statusCode="400" subStatusCode="-1" />
        <error statusCode="400" prefixLanguageFilePath="" 
            path="/errors/400" responseMode="ExecuteURL" />
        <remove statusCode="404" subStatusCode="13" />
        <error statusCode="404" subStatusCode="13" prefixLanguageFilePath=""
            path="/errors/file-upload-too-large" responseMode="Redirect" />
        <remove statusCode="404" subStatusCode="-1" />
        <error statusCode="404" prefixLanguageFilePath="" 
            path="/errors/404" responseMode="ExecuteURL" />
        <remove statusCode="403" subStatusCode="-1" />
        <error statusCode="403" prefixLanguageFilePath="" 
            path="/errors/403" responseMode="ExecuteURL" />
    </httpErrors>