我在global.asax中有这段代码:
protected void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
var httpException = exception as HttpException;
//...
}
如果我调用这样的网址,NonExistingNonesense
不存在:
localhost/ExistingArea/ExistingController/NonExistingNonesense
一切都很好。 (将调用我的global.asax中的代码)
但如果我这样称呼网址:
localhost/NonExistingNonesense
代码永远不会达到Application_Error
方法。
可能是什么问题?
我在web.config中有这个:
<system.web>
<customErrors mode="On"></customErrors>
<!-- ... -->
</system.web>
<system.webServer>
<httpErrors existingResponse="PassThrough"/>
<!-- ... -->
<system.webServer>
请注意:
我知道这可以用
<error statusCode="404" responseMode="ExecuteURL" path="/Error/PageNotFound" />
问题是,我需要将一些异常上下文传递给我的视图,所以我想通过代码处理它。
答案 0 :(得分:0)
除非IIS框架调用ASP.NET代码,否则不会触发它。默认情况下,IIS将在文件到达您的代码之前停止对不存在的文件的任何请求。但你可以关闭它。
进入IIS管理员并禁用Invoke handler only if request is mapped to a file选项。
答案 1 :(得分:0)
我不知道为什么代码在没有调试代码的情况下无法访问Application_Error。
但是,您可能希望尝试从Exception过滤404状态代码,并重定向到自定义404页面。
protected void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
// Process 404 HTTP errors
var httpException = exception as HttpException;
if (httpException != null && httpException.GetHttpCode() == 404)
{
Response.Clear();
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
// Call target Controller and pass the routeData.
IController controller = new CommonController();
var routeData = new RouteData();
routeData.Values.Add("controller", "Common");
routeData.Values.Add("action", "PageNotFound");
var requestContext = new RequestContext(
new HttpContextWrapper(Context), routeData);
controller.Execute(requestContext);
}
}
public class CommonController : Controller
{
[AllowAnonymous]
public ActionResult PageNotFound()
{
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
return View();
}
}
如果您只想检索异常上下文,可以使用错误操作方法检索它。
<system.web>
<customErrors defaultRedirect="~/Common/Error" mode="On">
<error statusCode="404" redirect="~/Common/PageNotFound"/>
</customErrors>
</system.web>
public class CommonController : Controller
{
[AllowAnonymous]
public ActionResult Error()
{
var exception = Server.GetLastError(); <--- Get Exception
Response.StatusCode = 503;
Response.TrySkipIisCustomErrors = true;
return View();
}
}