1.保障應用程式埠的連通性
通常情況下服務器的防火墻通常都是開啟的狀態,所以我們需要保證我們部署應用程式的埠是開啟了相應的訪問權限,否則我們的應用程式將無法被外界進行訪問,這里為了快速測驗應用程式的埠連通性,我們使用比較方便的Telnet工具進行測驗,該工具的安裝包內置在Windows作業系統中,所以使用起來比較方便,
1.1.Telnet客戶端安裝說明
打開“控制面板”,在“程式和功能”部分,單擊“打開或關閉 Windows 功能”,然后在“Windows 功能”串列中,選擇“Telnet 客戶端”,然后單擊“確定”,

1.2.Telnet測驗埠連通性
在電腦中打開CMD命令視窗,然后輸入該格式的命令:“Telnet IP 埠號”,在輸入完命令后進行回車后,如果能夠跳轉到“全黑無內容”的視窗則表示該埠可以正常訪問,

1.3.開啟埠訪問權限
如果Telnet提示連接失敗,我們則需要為服務器開通指定埠的訪問權限,開啟的步驟如下:
1.我們進入到“控制面板”找到“Windows防火墻”單擊打開,然后在Windows防火墻視窗左側找到“高級設定”,單擊后進入“入站規則”界面;

2.右擊左側欄的“入站規則”節點,點擊“新建規則”進入到“新建入站規則向導”界面,創建規則型別選擇“埠”單擊下一步;

3. 規則應用選擇TCP,規則應用的埠勾選“特定本地埠”,然后在輸入框中填寫我們要開通的埠,然后單擊下一步;

4.在操作步驟中選擇“允許連接”,在組態檔步驟中勾選所有選項(域、專用、公用);
5.輸入自定義規則名稱,單擊【完成】,即可完成創建;
1.4.Telnet測驗埠注意事項
埠只有在指定分配相應的“服務或站點”后,計算機偵聽埠串列才會包含相應的埠,telnet才能夠測驗相應埠的連通性,可以使用:“netstat -na”命令查看計算機偵聽的網路資訊,

如果我們在開通埠權限之前,我們的應用程式沒有部署在指定埠上,那么我們在命令視窗使用telnet測驗埠連通性的時候也是無法連接的,這是因為telnet的功能主要是連接到“服務或站點”的埠,所以前提條件是你開通的埠有指定相應的“服務或站點”,
2.排查-應用程式未啟動前出現的例外
對于部署之后的ASP.NET Core應用而言,如果是程式在為啟動之前發生的例外,通常可能是因為環境配置等原因導致應用程式無法啟動,并且我們無法通程序式日志獲取到詳細的例外資訊,導致我們很難排查解決問題的原因,
2.1.實際案例
應用程式在啟動之前首先會加載Startup.cs類的ConfigureServices方法以便配置相關的服務,在生產環境中,ConfigureServices方法中使用到了組態檔(appsettings.json)中的某個引數,并且該引數我們忘記配置到服務器環境中的組態檔(appsettings.json),這個時候我們訪問站點就會發現,瀏覽器顯示500的狀態碼且沒有詳細的錯誤資訊,由于是啟動時候的發生的例外,我們日志程式也沒有相應的記錄,

該案例是我實際作業中遇到的一個比較典型的案例,這種例外的情況也比較好復現出來,在排查問題原因的時候,為此投入了很多的時間和精力,當然可以在本地開發環境中進行調式查看開發例外資訊,但是對于專案上線場景的重要性和緊急程度而言,對于這種情況我們的專案必須要采取相應的應對措施,以便快速定位問題原因進行解決,
2.2.Opw.HttpExceptions.AspNetCore
在排查問題的程序中發現了一個“一勞永逸”的方法,就是“Opw.HttpExceptions.AspNetCore”這個第三方組件,該組件可以幫助我們在應用程式無法啟動的時候,以JSON格式回傳詳細的例外原因,下面介紹使用該組件的步驟:
A.安裝 nuget 包 Opw.HttpExceptions.AspNetCore
<PackageReference Include="Opw.HttpExceptions.AspNetCore" Version="2.3.0" />
B.在Startup類的ConfigureServices方法中找到注冊MVC服務的代碼,在后面新增呼叫方法AddHttpExceptions,注冊MVC服務的方式每個專案可能各有不同,找到相應的位置新增呼叫方法即可,

C.在Startup類中的Configure方法塊的首行添加 UseHttpExceptions方法,

至此在加入Opw.HttpExceptions.AspNetCore組件后,專案已經具備了在應用程式未啟動出現例外反饋錯誤資訊的能力,反饋的錯誤資訊格式如下圖:

通過回傳的JSON格式錯誤資訊,我們可以清楚知道程式配置啟動缺失一個“ClientId”引數,有關Opw.HttpExceptions.AspNetCore組件更多的使用方式請詳見官方檔案:https://libraries.io/nuget/Opw.HttpExceptions.AspNetCore
3.排查-應用程式在啟動后出現例外
我們常常在專案上線的程序中,在完成站點的發布和部署之后,訪問進入應用程式時,往往會發生一些意料之外的程式功能的例外,如點擊頁面操作某個功能或者進行登錄時,如果部署后的應用程式無法正常運行專案的業務功能,那么這意味著我們的部署作業是不成功的,我們必須要快速解決在上執行緒序中出現的任何程式例外,
對于生產環境上的ASP.NET Core應用在產生程式例外時,默認情況下我們是無法看到詳細的例外資訊的,頁面只是回傳一個500的狀態碼,這樣情況顯然對于我們排查問題和用戶體驗都是不利的,所以我們需要一種應對方式,既能捕獲詳細的例外資訊又能展示出友好的界面提示用戶,
3.1實際案例
在完成ASP.NET Core應用站點的上線部署后,通過指定的URL訪問站點,站點能夠成功回應請求并回傳登錄頁面,然而在執行登錄操作的時候,由于之前資料庫賬號的密碼發生了改變,而組態檔的連接字串沒有做出相應的調整,導致登錄時出現例外,然后應用程式并沒有在代碼中做出相應的例外處理,導致服務器回傳狀態碼500,并且頁面沒有任何的例外資訊,我們也并不知道是因為錯誤的資料庫連接字串導致的,

為了應對這種情況,我們將使用一種在ASP.NET Core中實作全域例外處理的方式來解決這種問題,該方式能夠捕獲到詳細的例外資訊,并且能夠將錯誤資訊友好的呈現到視圖中,
3.2UseExceptionHandler
在專案創建之初Startup.cs類的Configure方法中就存在了一個“UseDeveloperExceptionPage”的中間件,雖然它也可以捕獲例外資訊,但是只能用在非生產環境中,而對于生產環境中的例外處理我們這可以選擇“UseExceptionHandler”中間件進行處理,
具體的實作方式如下:
A.在Startup.cs類的Configure方法中添加UseExceptionHandler方法的呼叫,UseExceptionHandler方法需要傳入一個路由規則引數,該方法捕獲到例外時會跳轉到對應引數的控制器中,在控制器中我們可以針對例外做出相應的處理,比如進行日志的記錄、跳轉到呈現錯誤的視圖,

B.根據UseExceptionHandler方法傳入的引數(路由規則),創建對應的控制器和Action,并在Action中定義處理例外的具體措施,本文的措施是將例外資訊呈現到視圖頁面并記錄到日志,

C.創建呈現程式例外資訊的視圖頁面,

在配置好“UseExceptionHandler”的使用方式后,我們再次復現本段落中出現的案例情況(上線部署后站點能夠正常訪問,但是登錄時出現例外),看看能否呈現出詳細的例外資訊,

上圖已經通過UseExceptionHandler中間件的作用,成功反饋了例外資訊,很明顯一條關于資料庫連接的錯誤,這樣一來我們就可以有針對性的去排查例外的原因,從而避免“無的放矢”的局面,
結語
Web應用的部署看似流程標準化,但是部署人員經常會在這項作業中出現不可預知的風險,嚴重程度直接影響到客戶對專案的驗收,所以我們需要盡可能的去規避上線部署的風險,這其中規避風險的方式包括:網路的連通性檢查、程式的例外日志處理、上線演練等方式,
知識改變命運
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/500045.html
標籤:.NET技术
