2014年7月31日 星期四

[ASP.NET]Global.asax功能筆記

在ASP.NET專案底下有個Global.asax的檔案

該檔案可以在系統發生某些事件的時候被執行

個人用到的是捕捉例外的功能

在此做個筆記

<%@ Application Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Security" %>
<script RunAt="server">

    void Application_Start(object sender, EventArgs e)
    {
        // 應用程式啟動時執行的程式碼
    }

    void Application_End(object sender, EventArgs e)
    {
        //  應用程式關閉時執行的程式碼

    }

    void Application_Error(object sender, EventArgs e)
    {
        // 發生未處理錯誤時執行的程式碼
        HttpServerUtility server = HttpContext.Current.Server;
        HttpRequest request = HttpContext.Current.Request;
        HttpSessionState session = HttpContext.Current.Session;
        HttpBrowserCapabilities brower = HttpContext.Current.Request.Browser;
        Exception ex = server.GetLastError();
        System.Net.IPAddress ServerIP = new System.Net.IPAddress(System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList[0].Address);

        StreamWriter sw = null;

        try
        {
            if (ex.InnerException != null)
            {
                ex = ex.InnerException;
            }

            string filePath = string.Format(@"{0}Log\err_log_" + DateTime.Now.ToString("yyyyMMdd") + ".txt", server.MapPath("~/"));

            sw = File.Exists(filePath) ? new StreamWriter(filePath, true) : File.CreateText(filePath);

            sw.WriteLine("----------Strat----------");
            sw.WriteLine("----------[目前時間:" + DateTime.Now.ToString() + "]----------");
            sw.WriteLine("事件發生網頁網址:" + request.Url);
            sw.WriteLine("事件發生路徑:" + request.Path);
            sw.WriteLine("例外狀況訊息:" + ex.Message);
            //事件發生網頁網址

            sw.WriteLine("例外堆疊:" + ex.StackTrace);

            sw.WriteLine("造成錯誤的程式名稱:" + ex.Source);

            //使用者名稱
            if (session != null)
                sw.WriteLine("使用者名稱:" + Session["UserID"].ToString());

            sw.WriteLine("識別系統別:" + request.UserHostAddress);

            sw.WriteLine("IP:" + ServerIP.ToString());

            sw.WriteLine("使用瀏覽器:" + brower.Type);

            sw.WriteLine("是否支援Cookie:" + (brower.Cookies ? "是" : "否"));

            sw.WriteLine("伺服器名稱:" + request.ServerVariables["SERVER_NAME"]);

            sw.WriteLine("----------END----------");

        }
        catch (HttpException HE)
        {
            throw HE;
        }
        catch (ArgumentNullException ANE)
        {
            throw ANE;
        }
        catch (ArgumentException AE)
        {
            throw AE;
        }
        catch (UnauthorizedAccessException UAE)
        {
            throw UAE;
        }
        catch (DirectoryNotFoundException DNFE)
        {
            throw DNFE;
        }
        catch (IOException IOE)
        {
            throw IOE;
        }
        catch (SecurityException SE)
        {
            throw SE;
        }
        finally
        {
            sw.Close();
            sw.Dispose();
        }
    }
</script>


Application_Error可以捕捉網站中的例外

但是如果該例外在網頁中就已經被捕捉

就不會被Application_Error給catch到

所以簡單說Application_Error專門接漏網之魚

這很適合用在你在本機執行沒問題

丟到IIS莫名其妙掛掉的情況

還有一些例外情況但被忽略掉的情形

上面範例就是當發生例外時

會取得該例外物件

然後描述該例外的情形

最好用的就是HttpContext.Current.Request的Url跟Path屬性

他可以指出當前的Request是來自於哪個網址跟路徑

這在IIS上執行有bug時又不曉得bug從何而來很好用

其餘的HttpContext.Current.Server、HttpContext.Current.Session、HttpContext.Current.Request.Browser

都可以讓你取得當下相關資訊並且在Application_Error寫入txt或是資料庫

方便你事後分析問題點

參考文獻
[1] http://www.dotblogs.com.tw/mis2000lab/archive/2008/04/28/3526.aspx
[2] http://sharebody.com/list.asp?id=50684
[3] http://msdn.microsoft.com/zh-tw/library/vstudio/2027ewzw%28v=vs.100%29.aspx
[4] http://www.webjx.com/htmldata/2006-08-14/1155516831.html
[5] http://myprogramlog.blogspot.tw/2013/09/globalasax-applicationbeginrequest.html

沒有留言:

張貼留言