好的,我的Global.asax文件中有以下代码:
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
Exception objError = Server.GetLastError().GetBaseException();
Response.Redirect(
String.Format(
"/Error/{0}/{1}",
((HttpException)objError).GetHttpCode(),
Request.RawUrl));
}
提供整洁而整洁的错误网址,例如“/ Error / 404 / TheNameOfTheRequestedPage”。这可以在VS 2008中正常工作,但是一旦发布到我的本地机器,我就会得到默认的错误页面:
错误摘要
HTTP错误404.0 - 未找到
您正在寻找的资源 被删除,更改名称,或 暂时不可用
任何人都知道如何做到这一点?我选择不使用system.web / customErrors,因为我没有从那里访问Server.GetLastError()(或者至少它从来没有为我工作),我想得到http代码。
答案 0 :(得分:2)
这很可能与您触发IIS Http错误有关,该错误在节点下的web.config中定义
<system.webServer>
<httpErrors>
</httpErrors>
<system.webServer>
如果问题是您要返回404的响应代码并获取IIS 404页面,则需要执行此操作
Response.TrySkipIisCustomErrors = true;
在让响应完成之前,IIS将拦截错误。
如果你自己设置状态代码,这完全是不直观的。我试图想办法在Microsoft Connect上提交一个错误,手动设置http错误代码不会自动设置TrySkipIisCustomErrors
,但似乎无法找出任何相关产品提交给它。
答案 1 :(得分:0)
我遇到了类似的问题,并且在重定向之前调用Server.ClearError()
确实解决了问题。
在你的情况下,我会写
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
Exception objError = Server.GetLastError();
if(objError is HttpException){
//Need to clear the error, otherwise the buil-in redirect would occure
Server.ClearError();
Response.Redirect(
String.Format(
"/Error/{0}/{1}",
((HttpException)objError).GetHttpCode(),
Request.RawUrl));
}
}
请注意,Server.GetLastError()。GetBaseException()返回 base 异常,它并不总是HttpException,您要查找的异常只是GetLastError()。