一步步開發自己的博客 .NET版(11、Web.config文件的讀取和修改)

来源:http://www.cnblogs.com/zhaopei/archive/2016/07/18/5677053.html
-Advertisement-
Play Games

摘要: Web.config的讀取 對於Web.config的讀取大家都很屬性了。平時我們用得比較多的就是appSettings節點下配置。如: 我們對應的代碼是: 是的,很簡單、很方便、很清晰。可以總感覺缺少那麼一點“面向對象”的感覺。少還無所謂,如果幾十個上百個呢?我們是不是可以考慮分類定義,如... ...


Web.config的讀取

對於Web.config的讀取大家都很屬性了。平時我們用得比較多的就是appSettings節點下配置。如:

我們對應的代碼是:

= ConfigurationManager.AppSettings[“OAuth_QQ_ClientId”]; 
= ConfigurationManager.AppSettings[“OAuth_QQ_CallbackUrl”];
= ConfigurationManager.AppSettings[“OAuth_QQ_ClientScrert”];
= ConfigurationManager.AppSettings[“OAuth_Sina_ClientId”];
= ConfigurationManager.AppSettings[“OAuth_Sina_ClientScrert”];
= ConfigurationManager.AppSettings[“OAuth_Sina_CallbackUrl”];
........

 是的,很簡單、很方便、很清晰。可以總感覺缺少那麼一點“面向對象”的感覺。少還無所謂,如果幾十個上百個呢?我們是不是可以考慮分類定義,如下:

 <!--自定義配置-->
  <customCon>
    <!--郵件配置-->
    <mail mailPwd="" mailHost="" mailFrom="" />
    <!--QQ登陸-->
    <oAuthQQ OAuth_QQ_ClientId="" OAuth_QQ_ClientScrert="" OAuth_QQ_CallbackUrl="haojima.net/hi_login.html" />
    <!--新浪登錄-->
    <oAuthSina OAuth_Sina_ClientId="" OAuth_Sina_ClientScrert="" OAuth_Sina_CallbackUrl="haojima.net/hi_login.html" />
  </customCon>

 可是,你會發現 customCon 編輯器不認,因為這是我自己定義的一個,那如何是好?如下:(申明自定義標簽

如此,是不是感覺分類更清楚了?可是問題又來了,那我們怎麼讀取自定義標簽裡面的值呢?

首先:(註意:需要繼承ConfigurationSection

/// <summary>
    /// 自定義配置
    /// </summary>
    public class CustomCon : ConfigurationSection
    {
        /// <summary>
        /// 郵箱設置
        /// </summary>
        [ConfigurationProperty("mail", IsRequired = true)]
        public MailElement Mail
        {
            get { return (MailElement)this["mail"]; }
        }

        /// <summary>
        /// qq登錄
        /// </summary>
        [ConfigurationProperty("oAuthQQ", IsRequired = true)]
        public OAuthQQElement OAuthQQ
        {
            get { return (OAuthQQElement)this["oAuthQQ"]; }
        }

        /// <summary>
        /// 新浪登錄
        /// </summary>
        [ConfigurationProperty("oAuthSina", IsRequired = true)]
        public OAuthSinaElement OAuthSina
        {
            get { return (OAuthSinaElement)this["oAuthSina"]; }
        }
    } 

然後MailElement、OAuthQQElement、OAuthSinaElement 分別具體定義:

 #region MailElement(郵箱)
    public class MailElement : ConfigurationElement
    {
        /// <summary>
        /// 發件人密碼
        /// </summary>
        [ConfigurationProperty("mailPwd", IsRequired = true)]
        public string Pwd
        {
            get { return this["mailPwd"].ToString(); }
            set { this["mailPwd"] = value; }
        }

        /// <summary>
        /// SMTP郵件伺服器
        /// </summary>
        [ConfigurationProperty("mailHost", IsRequired = true)]
        public string Host
        {
            get { return this["mailHost"].ToString(); }
            set { this["mailHost"] = value; }
        }

        /// <summary>
        ///發件人郵箱
        /// </summary>
        [ConfigurationProperty("mailFrom", IsRequired = true)]
        public string From
        {
            get { return this["mailFrom"].ToString(); }
            set { this["mailFrom"] = value; }
        }
    }
    #endregion

    #region OAuthQQElement(QQ)
    public class OAuthQQElement : ConfigurationElement
    {

        [ConfigurationProperty("OAuth_QQ_ClientId", IsRequired = true)]
        public string ClientId
        {
            get { return this["OAuth_QQ_ClientId"].ToString(); }
            set { this["OAuth_QQ_ClientId"] = value; }
        }


        [ConfigurationProperty("OAuth_QQ_ClientScrert", IsRequired = true)]
        public string ClientScrert
        {
            get { return this["OAuth_QQ_ClientScrert"].ToString(); }
            set { this["OAuth_QQ_ClientScrert"] = value; }
        }


        [ConfigurationProperty("OAuth_QQ_CallbackUrl", IsRequired = true)]
        public string CallbackUrl
        {
            get { return this["OAuth_QQ_CallbackUrl"].ToString(); }
            set { this["OAuth_QQ_CallbackUrl"] = value; }
        }
    }
    #endregion

    #region OAuthSinaElement(新浪)
    public class OAuthSinaElement : ConfigurationElement
    {

        [ConfigurationProperty("OAuth_Sina_ClientId", IsRequired = true)]
        public string ClientId
        {
            get { return this["OAuth_Sina_ClientId"].ToString(); }
            set { this["OAuth_Sina_ClientId"] = value; }
        }


        [ConfigurationProperty("OAuth_Sina_ClientScrert", IsRequired = true)]
        public string ClientScrert
        {
            get { return this["OAuth_Sina_ClientScrert"].ToString(); }
            set { this["OAuth_Sina_ClientScrert"] = value; }
        }


        [ConfigurationProperty("OAuth_Sina_CallbackUrl", IsRequired = true)]
        public string CallbackUrl
        {
            get { return this["OAuth_Sina_CallbackUrl"].ToString(); }
            set { this["OAuth_Sina_CallbackUrl"] = value; }
        }
    }
    #endregion
View Code

到現在為止,我們在代碼層面已經建立和config一一對應的關聯了。下麵我們來取值:

 CustomCon custom = (CustomCon)ConfigurationManager.GetSection("customCon");
 var url = custom.OAuthQQ.CallbackUrl;//獲取值
 var id = custom.OAuthQQ.ClientId;//獲取值
 //、、、、、

如此是不是甚爽,比原先的 appSettings 更有“對象”的感覺了吧。且,當你配置過多的時候分類也更加清晰!

Web.config的寫入

 對於Web.config的寫入需求一般很少,多數都只是讀取。那為什麼我這裡要說寫入呢?因為好多人問我“這個博客系統的資料庫在哪裡?”,每次都解釋的'不亦樂乎',"這個是coder first根據代碼生成資料庫",後來次數多了實在受不了了。考慮著,是否可以做個引導頁面,初次使用的時候提示設置資料庫和郵箱什麼的(這樣的話對於沒有編程基礎的人搭建自己的博客系統也降低了門檻)。

第一次啟動程式的時候檢查資料庫連接,沒有就進入引導頁面,設置。(這個過程都不用去編輯Web.config文件了

好了,看了上面的效果圖我們繼續來看是怎麼把數據寫入到Web.config文件的吧。

其實很簡單,稍微改下上面代碼:

改成通過 WebConfigurationManager.OpenWebConfiguration 來讀取代碼就可以編輯了。不過不要忘了 config.Save(); 才會真正更新到Web.config裡面去。

到這裡還只能修改我們自定義的節點數據。我們最最主要的是想更新資料庫連接,請看下麵對資料庫連接的操作:

/// <summary>
/// 修改資料庫連接
/// </summary>
/// <param name="key"></param>
/// <param name="connectionString"></param>
/// <param name="providerName"></param>
public static void SetConnectionString(string key, string connectionString, string providerName = "System.Data.SqlClient")
{
    ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings");
    if (connectionSetting.ConnectionStrings[key] == null)//如果不存在此節點,則添加  
    {
        ConnectionStringSettings connectionStringSettings = new ConnectionStringSettings(key, connectionString, providerName);
        connectionSetting.ConnectionStrings.Add(connectionStringSettings);
    }
    else//如果存在此節點,則修改  
    {
        connectionSetting.ConnectionStrings[key].ConnectionString = connectionString;
        connectionSetting.ConnectionStrings[key].ProviderName = providerName;
    }
    config.Save();
}

其實,細看和我們上面的代碼大同小異。(只是把我們自定義的類改成了 ConnectionStringsSection .net預設的連接對象) 

 

好了,以上都是胡說八道。

主要是說下思路,大家自由發揮。感謝您的閱讀,希望對您有一點點作用!

文章首鏈:http://www.cnblogs.com/zhaopei/p/5677053.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作為一個菜鳥,避免不了被老鳥罵爹,但是如果能有一手漂亮的代碼給你作盾牌,多少能擋掉不少的鋒芒,作為菜鳥中的菜鳥的我,便嘗試起了重構自己的代碼。 這是一種不堪的憂傷…… 首先,教材入手《重構:改善即有代碼的設計》,重點是PDF版本,又是憂傷,買本書都沒錢了,又是一種憂傷…… 然後就對著書,邊學習,便嘗... ...
  • 在我們前面的代碼中已經接觸到了C#的類(class)還有類的方法。我們的代碼主要都放在Program 類的Main方法裡邊。我們也創建了我們自己的方法。同時我們也使用了類Console的writeline等方法。但是我想到目前為止我們還是不是很清楚類是一個什麼東西。接下來我就給大家介紹一下類還有面向 ...
  • 在離線環境中使用.NET Core 0x00 寫在開始 很早開始就對.NET Core比較關註,一改微軟之前給人的印象,變得輕量、開源、跨平臺。最近打算試著在工作中使用。但工作是在與互聯網完全隔離的網路中進行的,因此就開始了在離線環境中部署.NET Core開發環境的嘗試。總的來說還是比較蛋疼的,幾 ...
  • 分頁和排序,應該是軟體開發中,需要必知必會的技能了,對於分頁,網上很多教程,當然,別人終究是別人的,只有自己理解,會了,並且吸收之後,再用自己的語言,傳授出來,這才是硬道理。好了,廢話說多了。現在我們進入正題: 這裡,我打算使用EF Code-First方式分頁控制項就是用PagedList.MVC, ...
  • 隨著V5框架使用者的快速增加,終於促使我開始對整個框架編寫完整的Demo。上周大概花了一星期的時間,每天寫到夜裡3點半,終完成了框架所有功能的Demo。同時,按V5框架名稱空間的順序,對每個類的使用,補充相應的文章介紹,以漏補缺。 ...
  • 昨天《怎樣操作WebAPI介面(顯示數據)》http://www.cnblogs.com/insus/p/5670401.html既有使用jQuery,也有使作HttpClient來從資料庫獲取數據,並顯示在ASP.NET MVC的視圖中。今天Insus.NET想把例子全完成,就是把其餘的添加,更新 ...
  • 最近跟著師父學習軟體,因為軟體比較複雜,所以設計到判斷某個窗體是否打開了,如果打開了,進行某種操作,如果沒有打開,又進行另一種操作。 雖然不難,但是記一下總是好的。 ...
  • 什麼是Moq Moq是一個框架,一個可以模擬對象的框架,比如在不實現介面的情況下獲得介面的對象,這個介面的所有行為都可以用代碼控制 快速開始 被模擬的可以是介面和類,類不能是密封類,只有類中的虛函數能被模擬 先寫一個介面,下麵例子大部分用這個介面,但不全用這個介面 當不用 時候 Throws Moc ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...