错误处理 ASP.NET MVC
Error handling ASP.NET MVC
我正在处理错误(403、404、500)。我做了 ErrorController
和 Views
:
public class ErrorController : Controller
{
// GET: Error
public ActionResult General(Exception exception)
{
return View("Exception", exception);
}
public ActionResult Http404()
{
return View();
}
public ActionResult Http403()
{
return View();
}
}
然后我在Global.asax.cs
中写了如下代码:
protected void Application_Error()
{
var exception = Server.GetLastError();
log.Error(exception);
Response.Clear();
var httpException = exception as HttpException;
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException != null)
{
Response.StatusCode = httpException.GetHttpCode();
switch (Response.StatusCode)
{
case 403:
routeData.Values.Add("action", "Http403");
break;
case 404:
routeData.Values.Add("action", "Http404");
break;
default:
routeData.Values.Add("action", "Error");
break;
}
}
else
{
routeData.Values.Add("action", "General");
routeData.Values.Add("exception", exception);
}
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
IController errorsController = new ErrorController();
errorsController.Execute(new RequestContext(
new HttpContextWrapper(Context), routeData));
}
当控制器名称为 url 时有效(例如:http://localhost:62693/News/123
),然后我得到错误的 404 视图。
但是当我发送 url 时没有控制器名称或控制器名称无效(例如:http://localhost:62693/123
或 http://localhost:62693/new/k
)我只得到 HTML
错误代码404 浏览量。
如何使用任何 url 获取错误的 404 视图?
如果controller本身不存在,IIS使用预设的404错误页面。在 IIS 功能视图中查看 .net 错误页面。
将此添加到 webConfig
文件
<system.web>
<customErrors mode="On" defaultRedirect="~/Error/DefaultError">
</system.web>
// ErrorController ActionResult method...
public ActionResult DefaultError()
{
return view();
}
使用 RouteConfig
处理错误
You use route constraints to restrict the browser requests that match
a particular route. You can use a regular expression to specify a
route constraint.
Note : The custom router must be added to the RouterConfig file.
这个new {productId = @"\d+" }
是一个RouteConstraints
routes.MapRoute(
"Product",
"{controller}/{action}/{productId}",
new {controller="Home", action="Product"},
new {productId = @"\d+" }
);
解决我的问题只需添加
Response.ContentType = "text/html";
其他方法:
我找到了一些其他方法来产生自定义错误。
web.config
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" responseMode="ExecuteURL" path="/Error/Http404" />
</httpErrors>
</system.webServer>
控制器
public class ErrorController : Controller
{
public ActionResult PageNotFound()
{
Response.StatusCode = 404;
return View();
}
}
这对我有用。
我正在处理错误(403、404、500)。我做了 ErrorController
和 Views
:
public class ErrorController : Controller
{
// GET: Error
public ActionResult General(Exception exception)
{
return View("Exception", exception);
}
public ActionResult Http404()
{
return View();
}
public ActionResult Http403()
{
return View();
}
}
然后我在Global.asax.cs
中写了如下代码:
protected void Application_Error()
{
var exception = Server.GetLastError();
log.Error(exception);
Response.Clear();
var httpException = exception as HttpException;
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException != null)
{
Response.StatusCode = httpException.GetHttpCode();
switch (Response.StatusCode)
{
case 403:
routeData.Values.Add("action", "Http403");
break;
case 404:
routeData.Values.Add("action", "Http404");
break;
default:
routeData.Values.Add("action", "Error");
break;
}
}
else
{
routeData.Values.Add("action", "General");
routeData.Values.Add("exception", exception);
}
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
IController errorsController = new ErrorController();
errorsController.Execute(new RequestContext(
new HttpContextWrapper(Context), routeData));
}
当控制器名称为 url 时有效(例如:http://localhost:62693/News/123
),然后我得到错误的 404 视图。
但是当我发送 url 时没有控制器名称或控制器名称无效(例如:http://localhost:62693/123
或 http://localhost:62693/new/k
)我只得到 HTML
错误代码404 浏览量。
如何使用任何 url 获取错误的 404 视图?
如果controller本身不存在,IIS使用预设的404错误页面。在 IIS 功能视图中查看 .net 错误页面。
将此添加到 webConfig
文件
<system.web>
<customErrors mode="On" defaultRedirect="~/Error/DefaultError">
</system.web>
// ErrorController ActionResult method...
public ActionResult DefaultError()
{
return view();
}
使用 RouteConfig
处理错误You use route constraints to restrict the browser requests that match a particular route. You can use a regular expression to specify a route constraint.
Note : The custom router must be added to the RouterConfig file.
这个new {productId = @"\d+" }
是一个RouteConstraints
routes.MapRoute(
"Product",
"{controller}/{action}/{productId}",
new {controller="Home", action="Product"},
new {productId = @"\d+" }
);
解决我的问题只需添加
Response.ContentType = "text/html";
其他方法:
我找到了一些其他方法来产生自定义错误。
web.config
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" responseMode="ExecuteURL" path="/Error/Http404" />
</httpErrors>
</system.webServer>
控制器
public class ErrorController : Controller
{
public ActionResult PageNotFound()
{
Response.StatusCode = 404;
return View();
}
}
这对我有用。