当我们一个web项目开发已完成,测试也通过了后,就把他放到网上去,但是,bug是测不完的,特别是在一个大的网络环境下。那么,我们就应该记录这些错误,然后改正。这里,我的出错管理页面是在global.asax里面的,因为里面有一个Application_Error函数,我觉得这个就是管理错误的。其实,asp.net里还有一个方法,就是在 page 里指定出错的页面,由这个页面专门管理,我觉得这个方法也好,但是每次都要到相应的page里指定参数,不过,我觉得应该可以在web.config里配置吧。但是我还是喜欢下面的方法。下面我们就开始吧。 Global.asax代码: <% @ Application Language = " C# " %> < script runat = " server " > void Application_Start( object sender, EventArgs e) { // 在应用程序启动时运行的代码 } void Application_End( object sender, EventArgs e) { // 在应用程序关闭时运行的代码 } void Application_Error( object sender, EventArgs e) { // 在出现未处理的错误时运行的代码 Exception objErr = 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.StreamWriter writer=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.FileInfo file = 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, EventArgs e) { // 在新会话启动时运行的代码 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, EventArgs e) { // 在会话结束时运行的代码。 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer // 或 SQLServer,则不会引发该事件。 if (Application["Counts"] != null) { Application["Counts"] = Int32.Parse(Application["Counts"].ToString())-1; } } </ script > 显示出错信息的页面 ErrorPage.aspx代码: <% @ Page Language = " C# " AutoEventWireup = " true " CodeFile = " ErrorPage.aspx.cs " Inherits = " Error_ErrorPage " %> <! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN " " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " > < html xmlns = " http://www.w3.org/1999/xhtml " > < head runat = " server " > < title > 出错信息 </ title > < link href = " css/SITE.CSS " type = " text/css " rel = " stylesheet " /> </ head > < body > < form id = " form1 " runat = " server " > < asp:Label ID = " Label1 " runat = " server " Width = " 568px " ></ asp:Label > </ form > </ body > </ html > ErrorPage.aspx.cs protected void Page_Load( object sender, EventArgs e) { this.Label1.Text = Application["Error"].ToString(); }