當我們一個web項目開發已完成,測試也通過了後,就把他放到網上去,但是,bug是測不完的,特別是在一個大的網絡環境下。那麼,我們就應該記錄這些錯誤,然後改正。這裏,我的出錯管理頁面是在global.asax裏面的,因爲裏面有一個Application_Error函數,我覺得這個就是管理錯誤的。其實,asp.net裏還有一個方法,就是在 page 裏指定出錯的頁面,由這個頁面專門管理,我覺得這個方法也好,但是每次都要到相應的page裏指定參數,不過,我覺得應該可以在web.config裏配置吧。但是我還是喜歡下面的方法。下面我們就開始吧。
Global.asax代碼:
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>
<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代碼:
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>
<!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();
}
{
this.Label1.Text = Application["Error"].ToString();
}