[ASP.NET]Global.asax事件筆記_實際應用例子_停用 TLS 1.0_檔案上傳大小頁面跳轉_錯誤紀錄處理

 


Events in the Global.asax file (ASP.NET Application Life Cycle)

Application_Init:在應用程序被實例化或第一次被調用時,該事件被觸發。對於所有的HttpApplication 對象實例,它都會被調用。

Application_Disposed:在應用程序被銷燬之前觸發。這是清除以前所用資源的理想位置。

Application_Error:當應用程序中遇到一個未處理的異常時,該事件被觸發。

Application_Start:在HttpApplication 類的第一個實例被創建時,該事件被觸發。它允許你創建可以由所有HttpApplication 實例訪問的對象。

Application_End:在HttpApplication 類的最後一個實例被銷燬時,該事件被觸發。在一個應用程序的生命週期內它只被觸發一次。

Application_BeginRequest:在接收到一個應用程序請求時觸發。對於一個請求來說,它是第一個被觸發的事件,請求一般是用戶輸入的一個頁面請求(URL)。

Application_EndRequest:針對應用程序請求的最後一個事件。

Application_PreRequestHandlerExecute:在 ASP.NET 頁面框架開始執行諸如頁面或 Web 服務之類的事件處理程序之前,該事件被觸發。

Application_PostRequestHandlerExecute:在 ASP.NET 頁面框架結束執行一個事件處理程序時,該事件被觸發。

Applcation_PreSendRequestHeaders:在 ASP.NET 頁面框架發送 HTTP 頭給請求客戶(瀏覽器)時,該事件被觸發。

Application_PreSendContent:在 ASP.NET 頁面框架發送內容給請求客戶(瀏覽器)時,該事件被觸發。

Application_AcquireRequestState:在 ASP.NET 頁面框架得到與當前請求相關的當前狀態(Session 狀態)時,該事件被觸發。

Application_ReleaseRequestState:在 ASP.NET 頁面框架執行完所有的事件處理程序時,該事件被觸發。這將導致所有的狀態模塊保存它們當前的狀態數據。

Application_ResolveRequestCache:在 ASP.NET 頁面框架完成一個授權請求時,該事件被觸發。它允許緩存模塊從緩存中爲請求提供服務,從而繞過事件處理程序的執行。

Application_UpdateRequestCache:在 ASP.NET 頁面框架完成事件處理程序的執行時,該事件被觸發,從而使緩存模塊存儲響應數據,以供響應後續的請求時使用。

Application_AuthenticateRequest:在安全模塊建立起當前用戶的有效的身份時,該事件被觸發。在這個時候,用戶的憑據將會被驗證。

Application_AuthorizeRequest:當安全模塊確認一個用戶可以訪問資源之後,該事件被觸發。

Session_Start:在一個新用戶訪問應用程序 Web 站點時,該事件被觸發。

Session_End:在一個用戶的會話超時、結束或他們離開應用程序 Web 站點時,該事件被觸發。

Application_Error 事件顯示一個簡單的消息用以說明發生的錯誤。




一個實際應用示例

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace ScrapApp
{
    public class Global : System.Web.HttpApplication
    {
        //https://www.ithome.com.tw/news/126434
        //https://tools.ietf.org/html/draft-ietf-tls-oldversions-deprecate-00
        /// <summary>
        /// 在應用程式啟動時執行的程式碼
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Application_Start(object sender, EventArgs e)
        {
            const System.Security.Authentication.SslProtocols _Tls12 = (System.Security.Authentication.SslProtocols)0x00000C00;
            const System.Net.SecurityProtocolType Tls12 = (System.Net.SecurityProtocolType)_Tls12;
            System.Net.ServicePointManager.SecurityProtocol = Tls12;
        }

        /// <summary>
        /// 應用程式關閉時執行的程式碼
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Application_End(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// 發生未處理錯誤時執行的程式碼
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            //檔案上傳過大超出設定限制導入自訂錯誤頁
            System.Web.Configuration.HttpRuntimeSection section 
                = (System.Web.Configuration.HttpRuntimeSection)System.Configuration.ConfigurationManager.GetSection("system.web/httpRuntime");
            int maxFileSize = section.MaxRequestLength * 1024; //單位:kb
            if(Request.ContentLength > maxFileSize)
            {
                Response.Redirect(Server.MapPath("~/ErrorPages/SizeError.aspx"));
            }

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected 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("----------[目前時間:" + 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"]);
            }
            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();
            }
        }



    }
}


在Application_Start
加入的這三段是
因資安要求,需關閉TLS 1.0/TLS1.1安全通訊協定。需新增連線方式的呼叫模式。
如是在2020之後接觸到維護ASP.NET專案的
就會看到這三行code
主要是因應如下這個Issue的Solution
微軟、蘋果、Google及Mozilla四大瀏覽器業者將在2020年終止支援TLS 1.0、1.1
https://www.ithome.com.tw/news/126434
https://tools.ietf.org/html/draft-ietf-tls-oldversions-deprecate-00

How to implement Security Protocols TLS 1.2 in .Net 3.5 framework
系統停用 TLS 1.0 的 .NET 調整對策



Application_BeginRequest中
我們則可以去設定檔案上傳大小是否有超過設定門檻而導到對應自訂錯誤提示頁


在Application_Error中
則是By系統層級的錯誤捕捉(如沒被WEB Catch到的Exception等漏網之魚)
可能做一些引發的源頭跟錯誤訊息的紀錄等等




Ref:
Global.asax file. Agenda


ASP.NET Request Life Cycle


Global.asax Syntax
Understanding the Global.asax file
ASP.NET Application Life Cycle Overview for IIS 5.0 and 6.0

ASP.NET Application Life Cycle Overview for IIS 7.0


What is the purpose of global.asax in asp.net

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




留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header