各種配置文件的讀取和設置

一、定義的接口規範

using System;

namespace Fjelite.Technologic.Deadshot.Config
{
 /// <summary>
 /// 配置接口
 /// </summary>
 public interface IConfig
 {
  /// <summary>
  /// 獲取配置的值
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <returns>返回獲取的配置值</returns>
  string GetConfig(string configField);
  /// <summary>
  /// 設置配置的值
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  void SetConfig(string configField,string configValue);
  /// <summary>
  /// 增加一個配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  void AddConfig(string configField,string configValue);
  /// <summary>
  /// 刪除一個配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  void RemoveConfig(string configField);
 }
}

二、ini文件配置

using System;
using System.Text;
using System.Runtime.InteropServices;

namespace Fjelite.Technologic.Deadshot.Config
{
 /// <summary>
 /// IniConfig 的摘要說明。
 /// </summary>
 public class IniConfig:IConfig
 {
  private  string fileName;
  private IDataSecurity iDataSecurity;
  //*寫ini文件
  [DllImport("kernel32")]
  private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);
  //讀ini文件
  [DllImport("kernel32")]
  private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);
  /// <summary>
  /// 構造函數
  /// </summary>
  /// <param name="filename">配置文件名字</param>
  /// <param name="ids">加密解密方法</param>
  public IniConfig(string filename,IDataSecurity ids)
  {
   fileName=filename;
   iDataSecurity=ids;
  }
  #region IConfig 成員

  

  /// <summary>
  /// 獲取相應的配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <returns>如果取到該值返回對應值</returns>
  public string GetConfig(string configField)
  {
   System.Text.StringBuilder str = new StringBuilder(255);
   GetPrivateProfileString("configs",configField,"",str,255,fileName);
   return iDataSecurity.Decrypt(str.ToString());
  }

  /// <summary>
  /// 設置配置字段
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  public void SetConfig(string configField, string configValue)
  {
   WritePrivateProfileString("configs",configField,iDataSecurity.Encrypt(configValue),fileName);
  }

  /// <summary>
  /// 增加一個配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  public void AddConfig(string configField, string configValue)
  {
   // TODO:  添加 IniConfig.AddConfig 實現
   WritePrivateProfileString("configs",configField,iDataSecurity.Encrypt(configValue),fileName);
  }

  /// <summary>
  /// 移除一個配置,未實現
  /// </summary>
  /// <param name="configField">配置字段</param>
  public void RemoveConfig(string configField)
  {
   // TODO:  添加 IniConfig.RemoveConfig 實現
  }

  #endregion
 }
}

 

*.ini文件內容

[configs]'基本配置
database=391A9BAB8D7CE1AD

三、web.config的配置

using System;
using System.Xml;

namespace Fjelite.Technologic.Deadshot.Config
{
 /// <summary>
 /// WebConfig 的摘要說明。
 /// </summary>
 public class WebConfig:IConfig
 {
        private System.Xml.XmlDocument xmlDoc;
  private string fileName;
  private IDataSecurity iDataSecurity;
  /// <summary>
  /// 構造函數
  /// </summary>
  /// <param name="filename">配置文件名字</param>
  /// <param name="ids">加密解密類</param>
  public WebConfig(string filename,IDataSecurity ids)
  {
   xmlDoc=new XmlDocument();
   fileName=filename;
   iDataSecurity=ids;
   try
   { 
    xmlDoc.Load(filename);
    
   }
   catch
   {
    xmlDoc=null;
   }
  }
  #region IConfig 成員

  /// <summary>
  /// 獲取相應的配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <returns>如果取到該值返回對應值,沒有則返回null</returns>
  public string GetConfig(string configField)
  {
   // TODO:  添加 WebConfig.GetConfig 實現
   XmlNode xmlNode=xmlDoc.SelectSingleNode("configuration/appSettings/add[@key='" +configField +"']");
   if(xmlNode==null)
   {
    return null;
   }
   return iDataSecurity.Decrypt(xmlNode.Attributes["value"].Value);
  }

  /// <summary>
  /// 設置配置字段
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  public void SetConfig(string configField, string configValue)
  {
   XmlElement xmlNode=(XmlElement)xmlDoc.SelectSingleNode("configuration/appSettings/add[@key='" +configField +"']");
   if(xmlNode==null)
    return;
   xmlNode.SetAttribute("value",iDataSecurity.Encrypt(configValue));
   xmlDoc.Save(fileName);
  }

  /// <summary>
  /// 增加一個配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  /// <param name="configValue">配置值</param>
  public void AddConfig(string configField, string configValue)
  {
   XmlNode node=xmlDoc.SelectSingleNode("configuration/appSettings");
   XmlElement insertNode=xmlDoc.CreateElement("add");
   insertNode.SetAttribute("key",configField);
   insertNode.SetAttribute("value",iDataSecurity.Encrypt(configValue));
   node.AppendChild(insertNode);

   xmlDoc.Save(fileName);
  }
  /// <summary>
  /// 移除一個配置
  /// </summary>
  /// <param name="configField">配置字段</param>
  public void RemoveConfig(string configField)
  {
   if(configField.Length==0)
   {
    return;
   }
   XmlNode xmlNode=xmlDoc.SelectSingleNode("configuration/appSettings/add[@key='" +configField +"']");
   if(xmlNode!=null)
   {
    xmlNode.ParentNode.RemoveChild(xmlNode);
    
   }
   xmlDoc.Save(fileName);
  }

  #endregion
 }
}

四 、上述的加密接口

using System;

namespace Fjelite.Technologic.Deadshot.Config
{
 /// <summary>
 /// 數據安全類
 /// </summary>
 public interface IDataSecurity
 {
  /// <summary>
  /// 加密方法
  /// </summary>
  /// <param name="input">輸入字符串</param>
  /// <returns>加密後的返回值</returns>
  string Encrypt(string input);
  /// <summary>
  /// 解密方法
  /// </summary>
  /// <param name="input">輸入字符串</param>
  /// <returns>解密後的返回值</returns>
  string Decrypt(string input);
 }
}
五、實現的加密類

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

namespace Fjelite.Technologic.Deadshot.Config
{
 /// <summary>
 /// DataSecurityDES 的摘要說明。
 /// </summary>
 public class DataSecurityDES:IDataSecurity
 {
  private string key;
  /// <summary>
  /// 構造函數
  /// </summary>
  /// <param name="paraKey">DES加密解密鑰</param>
  public DataSecurityDES(string paraKey)
  {
   key=paraKey;
   if(key.Length<8)
    key+="12345678";
  }
  #region IDataSecurity 成員

  /// <summary>
  /// 加密方法
  /// </summary>
  /// <param name="input">輸入的值</param>
  /// <returns>加密後的值</returns>
  public string Encrypt(string input)
  {
   if(input.Length==0)
   {
    return "";
   }
   //return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(input,"MD5");
   DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   //把字符串放到byte數組中
   //原來使用的UTF8編碼,我改成Unicode編碼了,不行
   byte[] inputByteArray = Encoding.Default.GetBytes(input);

   //建立加密對象的密鑰和偏移量
   //使得輸入密碼必須輸入英文文本
   des.Key = ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
   des.IV = ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
   MemoryStream ms = new MemoryStream();
   CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(),CryptoStreamMode.Write);

   cs.Write(inputByteArray, 0, inputByteArray.Length);
   cs.FlushFinalBlock();
   StringBuilder ret = new StringBuilder();
   foreach(byte b in ms.ToArray())
   {
    ret.AppendFormat("{0:X2}", b);
   }
   ret.ToString();
   return ret.ToString();
  }

  /// <summary>
  /// 解密方法
  /// </summary>
  /// <param name="input">輸入值</param>
  /// <returns>解密後的值</returns>
  public string Decrypt(string input)
  {
   if(input.Length==0)
   {
    return "";
   }
   System.Security.Cryptography.DESCryptoServiceProvider des=new DESCryptoServiceProvider();
   byte[] inputByteArray=new byte[input.Length/2];
   int leng=inputByteArray.Length;
   for(int i = 0; i < input.Length / 2;i++)
   {
    string stt=input.Substring(i * 2, 2);
    int temp = Convert.ToInt32(input.Substring(i * 2, 2), 16);
    inputByteArray[i] = (byte)temp;
   }
   des.Key=System.Text.ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
   des.IV=System.Text.ASCIIEncoding.ASCII.GetBytes(key.Substring(0,8));
   MemoryStream ms = new MemoryStream();
   CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(),CryptoStreamMode.Write);
   cs.Write(inputByteArray, 0, inputByteArray.Length);
   cs.FlushFinalBlock();
   //建立StringBuild對象,CreateDecrypt使用的是流對象,必須把解密後的文本變成流對象
   //StringBuilder ret = new StringBuilder();
   return System.Text.Encoding.Default.GetString(ms.ToArray());

  }

  #endregion
 }
}
其餘的配置都可從實現該接口來配置

發佈了29 篇原創文章 · 獲贊 1 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章