当我们一个web项目开发已完成,测试也通过了后,就把他放到网上去,但是,bug是测不完的,特别是在一个大的网络环境下。那么,我们就应该记录这些错误,然后改正。这里,我的出错管理页面是在global.asax里面的,因为里面有一个Application_Error函数,我觉得这个就是管理错误的。其实,asp.net里还有一个方法,就是在 page 里指定出错的页面,由这个页面专门管理,我觉得这个方法也好,但是每次都要到相应的page里指定参数,不过,我觉得应该可以在web.config里配置吧。但是我还是喜欢下面的方法。下面我们就开始吧。
Global.asax代码:
显示出错信息的页面
ErrorPage.aspx代码:
ErrorPage.aspx.cs
Global.asax代码:
<%
@ApplicationLanguage
=
"
C#
"
%>
< scriptrunat = " server " >
void Application_Start( object sender,EventArgse)
{
// 在应用程序启动时运行的代码
}
void Application_End( object sender,EventArgse)
{
// 在应用程序关闭时运行的代码
}
void Application_Error( object sender,EventArgse)
{
// 在出现未处理的错误时运行的代码
ExceptionobjErr = Server.GetLastError().GetBaseException();
string error = string .Empty;
string errortime = string .Empty;
string erroraddr = string .Empty;
string errorinfo = string .Empty;
string errorsource = string .Empty;
string errortrace = string .Empty;
error += " 发生时间: " + System.DateTime.Now.ToString() + " <br> " ;
errortime = " 发生时间: " + System.DateTime.Now.ToString();
error += " 发生异常页: " + Request.Url.ToString() + " <br> " ;
erroraddr = " 发生异常页: " + Request.Url.ToString();
error += " 异常信息: " + objErr.Message + " <br> " ;
errorinfo = " 异常信息: " + objErr.Message;
// error+="错误源:"+objErr.Source+"<br>";
// error+="堆栈信息:"+objErr.StackTrace+"<br>";
errorsource = " 错误源: " + objErr.Source;
errortrace = " 堆栈信息: " + objErr.StackTrace;
error += " --------------------------------------<br> " ;
Server.ClearError();
Application[ " error " ] = error;
// 独占方式,因为文件只能由一个进程写入.
System.IO.StreamWriterwriter = null ;
try
{
lock ( this )
{
// 写入日志
string year = DateTime.Now.Year.ToString();
string month = DateTime.Now.Month.ToString();
string path = string .Empty;
string filename = DateTime.Now.Day.ToString() + " .txt " ;
path = Server.MapPath( " ~/Error/ " ) + year + " / " + month;
// 如果目录不存在则创建
if ( ! System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
System.IO.FileInfofile = new System.IO.FileInfo(path + " / " + filename);
// if(!file.Exists)
// file.Create();
// file.Open(System.IO.FileMode.Append);
writer = new System.IO.StreamWriter(file.FullName, true ); // 文件不存在就创建,true表示追加
writer.WriteLine( " 用户IP: " + Request.UserHostAddress);
// if(Session["UserName"]!=null)
// {
// writer.WriteLine("用户名"+System.Web.HttpContext.Current.Session["UserName"].ToString());
// }
writer.WriteLine(errortime);
writer.WriteLine(erroraddr);
writer.WriteLine(errorinfo);
writer.WriteLine(errorsource);
writer.WriteLine(errortrace);
writer.WriteLine( " -------------------------------------------------------------------------------------- " );
// writer.Close();
}
}
finally
{
if (writer != null )
writer.Close();
}
Response.Redirect( " ~/Error/ErrorPage.aspx " );
}
void Session_Start( object sender,EventArgse)
{
// 在新会话启动时运行的代码
Session.Timeout = 60 ;
if (Session.IsNewSession)
{
lock ( this )
{
if (Application[ " Counts " ] != null )
{
Application[ " Counts " ] = Int32.Parse(Application[ " Counts " ].ToString()) + 1 ;
}
else
{
Application[ " Counts " ] = 1 ;
}
}
}
}
void Session_End( object sender,EventArgse)
{
// 在会话结束时运行的代码。
// 注意:只有在Web.config文件中的sessionstate模式设置为
// InProc时,才会引发Session_End事件。如果会话模式设置为StateServer
// 或SQLServer,则不会引发该事件。
if (Application[ " Counts " ] != null )
{
Application[ " Counts " ] = Int32.Parse(Application[ " Counts " ].ToString()) - 1 ;
}
}
</ script >
< scriptrunat = " server " >
void Application_Start( object sender,EventArgse)
{
// 在应用程序启动时运行的代码
}
void Application_End( object sender,EventArgse)
{
// 在应用程序关闭时运行的代码
}
void Application_Error( object sender,EventArgse)
{
// 在出现未处理的错误时运行的代码
ExceptionobjErr = Server.GetLastError().GetBaseException();
string error = string .Empty;
string errortime = string .Empty;
string erroraddr = string .Empty;
string errorinfo = string .Empty;
string errorsource = string .Empty;
string errortrace = string .Empty;
error += " 发生时间: " + System.DateTime.Now.ToString() + " <br> " ;
errortime = " 发生时间: " + System.DateTime.Now.ToString();
error += " 发生异常页: " + Request.Url.ToString() + " <br> " ;
erroraddr = " 发生异常页: " + Request.Url.ToString();
error += " 异常信息: " + objErr.Message + " <br> " ;
errorinfo = " 异常信息: " + objErr.Message;
// error+="错误源:"+objErr.Source+"<br>";
// error+="堆栈信息:"+objErr.StackTrace+"<br>";
errorsource = " 错误源: " + objErr.Source;
errortrace = " 堆栈信息: " + objErr.StackTrace;
error += " --------------------------------------<br> " ;
Server.ClearError();
Application[ " error " ] = error;
// 独占方式,因为文件只能由一个进程写入.
System.IO.StreamWriterwriter = null ;
try
{
lock ( this )
{
// 写入日志
string year = DateTime.Now.Year.ToString();
string month = DateTime.Now.Month.ToString();
string path = string .Empty;
string filename = DateTime.Now.Day.ToString() + " .txt " ;
path = Server.MapPath( " ~/Error/ " ) + year + " / " + month;
// 如果目录不存在则创建
if ( ! System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
System.IO.FileInfofile = new System.IO.FileInfo(path + " / " + filename);
// if(!file.Exists)
// file.Create();
// file.Open(System.IO.FileMode.Append);
writer = new System.IO.StreamWriter(file.FullName, true ); // 文件不存在就创建,true表示追加
writer.WriteLine( " 用户IP: " + Request.UserHostAddress);
// if(Session["UserName"]!=null)
// {
// writer.WriteLine("用户名"+System.Web.HttpContext.Current.Session["UserName"].ToString());
// }
writer.WriteLine(errortime);
writer.WriteLine(erroraddr);
writer.WriteLine(errorinfo);
writer.WriteLine(errorsource);
writer.WriteLine(errortrace);
writer.WriteLine( " -------------------------------------------------------------------------------------- " );
// writer.Close();
}
}
finally
{
if (writer != null )
writer.Close();
}
Response.Redirect( " ~/Error/ErrorPage.aspx " );
}
void Session_Start( object sender,EventArgse)
{
// 在新会话启动时运行的代码
Session.Timeout = 60 ;
if (Session.IsNewSession)
{
lock ( this )
{
if (Application[ " Counts " ] != null )
{
Application[ " Counts " ] = Int32.Parse(Application[ " Counts " ].ToString()) + 1 ;
}
else
{
Application[ " Counts " ] = 1 ;
}
}
}
}
void Session_End( object sender,EventArgse)
{
// 在会话结束时运行的代码。
// 注意:只有在Web.config文件中的sessionstate模式设置为
// InProc时,才会引发Session_End事件。如果会话模式设置为StateServer
// 或SQLServer,则不会引发该事件。
if (Application[ " Counts " ] != null )
{
Application[ " Counts " ] = Int32.Parse(Application[ " Counts " ].ToString()) - 1 ;
}
}
</ script >
显示出错信息的页面
ErrorPage.aspx代码:
<%
@PageLanguage
=
"
C#
"
AutoEventWireup
=
"
true
"
CodeFile
=
"
ErrorPage.aspx.cs
"
Inherits
=
"
Error_ErrorPage
"
%>
<! DOCTYPEhtmlPUBLIC " -//W3C//DTDXHTML1.0Transitional//EN " " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
< htmlxmlns = " http://www.w3.org/1999/xhtml " >
< headrunat = " server " >
< title > 出错信息 </ title >
< linkhref = " css/SITE.CSS " type = " text/css " rel = " stylesheet " />
</ head >
< body >
< formid = " form1 " runat = " server " >
< asp:LabelID = " Label1 " runat = " server " Width = " 568px " ></ asp:Label >
</ form >
</ body >
</ html >
<! DOCTYPEhtmlPUBLIC " -//W3C//DTDXHTML1.0Transitional//EN " " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
< htmlxmlns = " http://www.w3.org/1999/xhtml " >
< headrunat = " server " >
< title > 出错信息 </ title >
< linkhref = " css/SITE.CSS " type = " text/css " rel = " stylesheet " />
</ head >
< body >
< formid = " form1 " runat = " server " >
< asp:LabelID = " Label1 " runat = " server " Width = " 568px " ></ asp:Label >
</ form >
</ body >
</ html >
ErrorPage.aspx.cs
protected
void
Page_Load(
object
sender,EventArgse)
{
this .Label1.Text = Application[ " Error " ].ToString();
}
{
this .Label1.Text = Application[ " Error " ].ToString();
}