大家都知道,asp.net 处理错误有优先顺序,Page_Error>ErrorPage>Applilcation_Error>customErrors,现在我有一个奇怪的问题,
Applilcation_Error方法是记录错误内容日志的:
{
string errorUrl = Request.Url.ToString();
DateTime dt = DateTime.Now;
Exception ex = Server.GetLastError().GetBaseException();
string path = Server.MapPath("/ErrorLog.txt");
if (System.IO.File.Exists(path))
{
using (StreamWriter sw = System.IO.File.AppendText(path))
{
sw.WriteLine("时间:" + dt.ToString());
sw.WriteLine("详细错误信息:" + ex);
sw.WriteLine("错误链接地址:" + errorUrl);
sw.WriteLine("");
sw.Flush();
sw.Close();
}
}
else
{
using (StreamWriter sw = System.IO.File.CreateText(path))
{
sw.WriteLine("时间:" + dt.ToString());
sw.WriteLine("详细错误信息:" + ex);
sw.WriteLine("错误链接地址:" + errorUrl);
sw.WriteLine("");
sw.Flush();
sw.Close();
}
}
Server.Transfer("/app-error.htm"); //这句代码很奇怪
}
customErrors配置文件我是这样写的:
<customErrors mode="Off" defaultRedirect="/Error/Generic">
<error statusCode="403" redirect="/Error/NoAccess"/>
<error statusCode="404" redirect="/Error/FileNotFound"/>
</customErrors>
首先说在本地,如果我只配置Application_Error方法,并在记录错误后我跳转到错误页面,这个是没问题的,并且可以记录到错误信息,但是如果我加上web.config中custoErrors上面的代码,可以跳转,但是错误日志没有了,他不记录了 。
但是我想就用第一个吧,反正让他跳转到指定的错误页面就行,但是这时候问题又来了,部署到IIS上如果页面出现错误,页面不跳转,但是错误还是记录了,为什么就没有跳转到制定的错误页面呢?在本地都是可以的呀!!
可能有点急,比较乱,我现在就说几个重点问题:
1.为什么Application_Error方法和custoErrors不能同时设置
2.为什么如果只在Application_Error接收错误并跳转页面,在本地可以,为什么部署到iis就不跳转了呢?
------解决方案--------------------------------------------------------
是因为错误信息被IIS截获了吧,看一个这个属性:
http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx
和这篇文章:
http://blog.davebouwman.com/2011/04/21/custom-404-pages-for-asp-net-mvc-3/