我正在尝试在出现错误时重定向到自定义页面。所以我在Web.Config
添加了以下代码
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Views/Error/Error500.cshtml">
<error statusCode="404" redirect="~/Views/Error/Error404"/>
<error statusCode="500" redirect="~/Views/Error/Error500"/>
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="~/Views/Error/Error404" responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" path="~/Views/Error/Error500" responseMode="ExecuteURL" />
</httpErrors>
但是当我尝试localhost:23920 / aFakeURl时,它会将我重定向到一个空白页面,但它没有到达我的ErrorController
。
如果我尝试localhost:23920 / Error / Error404它会进入我的控制器
// GET: /Error/Error404
public ActionResult Error404()
{
Response.StatusCode = 404;
return View();
}
然后它返回statusCode
404,IIS不知道如何处理它,它给了我一个空白页面。所以我很确定问题是Web.Config
中的路径。
我试过
~/Views/Error/Error404"
~/Views/Error/Error404.cshtml"
/Views/Error/Error404"
/Views/Error/Error404.cshtml"
值得一提的是,当路径没有~
时,它会返回运行时异常而不是空白页。
所以我有2个问题。
Web.Config
的正确方法是什么?Response.StatusCode = 404;
中的ErrorController
?谢谢
我不知道是否提及,但我使用Elmah
进行错误处理和记录。不知道它是否与此问题有关,但我在他们的文档中读到它应该与mode="On"
一起使用。有没有更好的方法来处理这一切?
修改
现在我用这个
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/Error/Error500">
<error statusCode="404" redirect="/Error/Error404"/>
<error statusCode="500" redirect="/Error/Error500"/>
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/Error/Error404" responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" path="/Error/Error500" responseMode="ExecuteURL" />
</httpErrors>
但是当我输入错误的网址时,它总是返回错误500.
例外是System.Web.HttpException: The controller for path '/aBadUrllllll' was not found or does not implement IController.
为什么这不会返回404错误?
我是否必须更改Route.config中的内容?
答案 0 :(得分:1)
可以放置标签: 您还需要指定常规错误代码和页面,如下所示:
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Auto">
<remove statusCode="403" subStatusCode="14"/>
<error statusCode="403" subStatusCode="14" responseMode="ExecuteURL"
path="/App/Error/Forbidden"/>
<remove statusCode="404"/>
<error statusCode="404" responseMode="ExecuteURL" path="/App/Error/NotFound"/>
</httpErrors>...
请记住在控制器错误中创建页面NotFound!
答案 1 :(得分:0)
我遇到了类似的问题,最终通过确保我做了以下所有事情来解决问题:
1)customErrors mode =&#34; On&#34;已在web.config中设置
2)创建了一个ErrorController,其中包含针对需要自定义错误页面的特定错误的操作。
e.g。
[AllowAnonymous]
public virtual ActionResult NotFound(string message = "")
{
HttpContext.Response.StatusCode = 404;
return View();
}
3)创建了一个Filter.config文件来添加HandleErrorAttribute,并在global.asax的app start中调用此方法。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
4)在global.asax中添加了全局错误处理程序。这是一个不完整的样本。
void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
Response.Clear();
var httpException = exception as HttpException;
if (httpException != null)
{
var action = string.Empty;
switch (httpException.GetHttpCode())
{
case 401:
action = "Unauthorized";
break;
case 403:
action = "Forbidden";
break;
case 404:
action = "NotFound";
break;
case 500:
action = "ServerError";
break;
default:
action = "ServerError";
break;
}
Server.ClearError();
Response.Redirect(string.Format("~/Error/{0}/?message={1}", action, exception.Message));
}
Logger.Error("Unhandled website exception", exception);
}
有了这一切,那么硬性异常也将得到妥善处理和有意重定向。例如,如果在登录时未达到业务规则而导致用户无法继续操作,则完成此操作。
返回RedirectToAction(&#34;未经授权&#34;,&#34;错误&#34;,新{message =&#34;您的帐户无法使用此功能。&#34;});
但是,有一条建议是,返回401错误最终不会显示错误页面并将您带到登录页面,除非您正确处理它。我确信在其他一些帖子中有解释。
另外一件事,我刚刚在Dev和UAT环境中部署了最新版本时就发现了这一点。在我的本地IIS中,我看到自定义错误页面很好,但在其他环境中它显示了默认的IIS页面。路由到我的ErrorController工作得很好,但自定义页面仍未显示。结果我需要这个web.config条目
httpErrors existingResponse =&#34; PassThrough&#34;
在system.webServer下,现在有意义。