iT邦幫忙

0

[ASP.NET] - 使用 INI 為網站提供相關參數設定

[前言]

當您使用了 ASP.NET 來做為網站、API 開發,都會使用 Web.Config 來做為一些相關參數的設定。但這些設定在 Visual Studio 有可能設定的關係會被編輯器覆蓋掉,又得從其他備份檔中將設定再還原回來,自己也碰過好幾次了。再者 Web.Config 有一堆跟網站有相關的參數資料與參考的元件,也不好閱讀整個設定都要再找一下,真覺得太麻煩了...

另外 ASP.NET 要做到 路由 Routing 功能,必須得在 Global.asax 上設定相關的參數,但網站不太可能只有幾個頁面,可能還有十多個頁面,如果每次新增都得再去 Global.asax 設定還得再多寫說明與介紹,設定一堆累積下來您的 Global 內容也是很可觀。

透過 INI 檔也提供註解方式與說明來明確解釋,這也是覺得重要的一點。這些解釋與宣告的資訊,最主要是在做什麼,告訴自己與承接人,可以明確了解到相關資訊。

程式碼的部份你可以先參考以下二個說明

INI 檔程式碼可以參考 https://codertw.com/%E5%89%8D%E7%AB%AF%E9%96%8B%E7%99%BC/265800/
Routes 要如何使用可以先行參考這個 https://dotblogs.com.tw/stanley14/2016/05/10/163912

(注意:你的 INI 與相關設定不一定要跟我一樣,隨你自己習慣先自行修改)

[用 INI 來加強 ASP.NET Routes 應用]

我的 INI 檔設定檔名為 Web_RegisterRoutes.ini

//========================================
// 此檔案請使用 Unicode 格式進行儲存的動作,顯示中文時才會正常
// 針對網站上設定 (路由-Register Routes) 
// Routes_MainList 是最主要的用途路由名稱,這些名稱用(逗號)做為區格條件 [Splite Array]
// 服務網址就會像是 https://三級網域名.xxxx.com/Default/ 或是 https://三級網域名.xxxx.com/About/ 來做為路由的應用
//,FbRegister,GoogleLogin,GoogleRegister
//========================================
[Routes_MainList]
RoutesMain=API,AboutAsk
WebSiteVersion=V1

//==============================
//服務應用 = 針對 API 使用者登入
//==============================
[Routes_API]
Routes_ServiceID=API
Routes_RouteUrl=/
Routes_ServiceNAME=提供給外部可以直接下達 ~/API 接收 POST JSON 來得到資料
Routes_FilePath=~/API_Mobile.aspx

//==============================
//服務應用 = 介紹公司相關資料
//服務用途 = 
//==============================
[Routes_AboutAsk]
Routes_ServiceID=AboutAsk
Routes_RouteUrl=/{AboutInfo}
Routes_ServiceNAME=聯絡我們
Routes_FilePath=~/Mobile_About_ConsumerAsk.aspx

我的 INI 讀取程式

/// <summary>
/// 引用此網站現在的目錄位置下的 Web.INI 檔
/// </summary>
_Commonlibrary.WebSite_RegeditINI _RegeditINI = new WebSite_RegeditINI(System.AppDomain.CurrentDomain.BaseDirectory + "Web_RegisterRoutes.ini");

/// <summary>
/// 建構基礎 WebSite 路由
/// </summary>
/// <param name="_Routeinfo"></param>
/// <returns></returns>
public void _Build(System.Web.Routing.RouteCollection _Routeinfo)
{

//取得預設的 Routes 路由根內容
string[] _strRoutesInfo = _RegeditINI.getKeyValue("Routes_MainList", "RoutesMain").Split(',');

    for (int i = 0; i < _strRoutesInfo.Length; i++)
    {
       try
          {
           _Routeinfo.MapPageRoute(
               _RegeditINI.getKeyValue("Routes_" + _strRoutesInfo[i], "Routes_ServiceID"), 
               _strRoutesInfo[i].ToString() + _RegeditINI.getKeyValue("Routes_" + _strRoutesInfo[i], "Routes_RouteUrl"), 
               _RegeditINI.getKeyValue("Routes_" + _strRoutesInfo[i], "Routes_FilePath"));
           }
       catch{ 
               //自訂讀入錯誤或是己得到宣告要如何做 
            }
    }
}

以 INI 的設定,在 RoutesMain=API,AboutAsk 設定了 API , AboutAsk ,讀入時以 Splite 的方式來將 RoutesMain 文字拆解出來,並透過 System.Web.Routing.RouteCollection 來得到來自於 Global.asax 的導入來設定 MapPageRoute 。

讀取方式:RegeditINI.getKeyValue("Routes" + _strRoutesInfo[i], "Routes_ServiceID")

"Routes_" + _strRoutesInfo[i] >> 就會取得 Routes_AboutAsk 名稱 ,並讀入 Routes_ServiceID 來取得 AboutAsk ,再來讀入 Routes_RouteUrl 是否有要設定相關參數值 {AboutInfo} ,再讀入 Routes_FilePath 指定要執行的應用程式是那一個。

而 Routes_ServiceNAME 提供給 this.Page.Header.Title 標頭名稱,但這段可以自行考慮要不要放在 MasterPage 來給於網頁的標題名稱與相關的基礎設定

[Routes_AboutAsk]
Routes_ServiceID=AboutAsk
Routes_RouteUrl=/{AboutInfo}
Routes_ServiceNAME=聯絡我們
Routes_FilePath=~/Mobile_About_ConsumerAsk.aspx

透過以上的程序 Global.asax 可以修改成以下


void Application_Start(object sender, EventArgs e)
{
   //取得與設定 WebSite 路由
   _Commonlibrary.WebSite_RegisterRoutes _RegisterRoutes = new _Commonlibrary.WebSite_RegisterRoutes();
   //給於現在的路由資料以提供給服務
   _RegisterRoutes._Build(System.Web.Routing.RouteTable.Routes);
}

網站只要執行這網址 http://YouDomainName.com.tw/AboutAsk/Ab1234 就可以執行 Mobile_About_ConsumerAsk.aspx 網頁程式,那參數 {AboutInfo} = Ab1234 就可以用 Page.RouteData.Values["AboutInfo"].ToString() 取得相關的資訊,如 URL 沒有傳進相關資訊判斷一下就可以。

我定義了 [AboutAsk] 最主要是在提供相關 "公司介紹、PDF 文件" 等相關要展示的說明等等。傳入了 Ab1234 可以指定要顯示相關資訊與文件,當然的...你想導出什麼資料都可以...

當您的網站要更新,而且你增加了一些 Route 設定,建議連同 IIS 應用程式集區,重新啟動或是回收,這樣子 Routes 讀取時會比較好才不會有其他問題。

使用 INI 檔來配合 Routes 個人認為有以下幾個好處..

(1). Routes 相關參數設定上方便管理
(2). URL 的部份可以簡化,你的 URL 就不需要直接 Show 出 ASP.NET Web Form 檔案名稱
(3). 檔案方便管理,當需求功能多你不可能只有寫一支像是程式包起整個需求,一定從檔名來規定好這些功能是做什麼的。 檔名您可以取名 落落長(台語) 像是針對 Mobile 版本可以取名為

Mobile_Shopping_OrderCheckOut.aspx
Mobile_Shopping_OrderCheckOut_TranSactionBack.aspx

傳送交易有 ATM , OnlineCard 等,如果你的交易還有分各家銀行,每家銀行傳遞的方式也會不一樣,像是串接台新銀行是透過 JSON 的方式,聯合信用卡中心是使用 Request.Form 來回傳交易的結果。 以台新銀行為例 Taishin 那就會用以下取名 ATM、Card、ATMLocation(線下 ATM 機器轉帳)

OnlineBank_Taishin_ATM.aspx
OnlineBank_Taishin_Card.aspx
OnlineBank_Taishin_ATMLocation.aspx

每一家的銀行,我都是另外再切割出不同的應用,從來不會相同的功能就集合在一起做處理,那天銀行需求有改變與修正,那就不會影響到其他銀行的應用。每一個交易會有傳出與傳入,還會分更多的檔案來接收其資料內容,或是接收到資料後你必須還要發 Email 來做相關的通知等等,另外如果出現 Bug 也比較好維護與處理。

(4). 可以透過 Routes 來做到 Web API 的應用,透過像是 PostMan 來達到 API 的應用開發與測試,但這部份我會建議用 POST JSON 的方式來傳遞相關處理的部份,例如以下的畫面是透過 ASP.NET 來做到 WebAPI ,傳送時以 POST 的方式傳送 JSON 內容過來給 ASP.NET 並由 Request.Form[0] 來讀取 Form 內容,讀到後再進行相關的解析動作。

 https://ithelp.ithome.com.tw/upload/images/20200210/201048515BQxFuMHnO.png

針對 ASP.NET 寫 API 與 PostMan 測試後續再提供一篇文章來說明


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言