• C# 解决无法识别的属性 configProtectionProvider


    在使用.Net自身提供的加密本配置文件后再用System.Configuration.ConfigurationManager.AppSettings["key"]获取值时会出现“无法识别的属性 configProtectionProvider参考”

    注意:
    1. 如果你是自定义加密值再保存到配置文件和则Aspnet_regiis.exe不会出现此问题,即不使用.Net默认的加密方式
    2. 使用.Net默认加密方式示例
    3. Configuration configuration =ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
      #region 保存配置文件
      try
      {
      //加密配置信息
      if(isProtected &&!configuration.AppSettings.SectionInformation.IsProtected)
      {
      configuration.AppSettings.SectionInformation.ForceSave=true;
      configuration.AppSettings.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
      }
      configuration.Save();
      }
      catch(Exception)
      {
    4. 使用此加密方式会加密节点下所有的数据
    5. .Net自身的加密是跟电脑相关的,即在开发者电脑上生成的配置文件发布到生产机器上(包括所有非开始者电脑)都无法获取配置值会出现以下问题
         
    在Google和stackoverflow上搜索都没有解决看来
    只有自己动脑啦,经过一番摸索最终解决将自己的解决方案记录如下:
    之前的方法:
    /// <summary>
    /// 获取配置文件指定的值
    /// </summary>
    /// <param name="key"></param>
    /// <returns>健值</returns>
    public static string GetConfig(string key)
    {
        //如果使用.Net对配置文件进行加密过,则访问ConfigurationManager.AppSettings会产生错误"无法识别的属性 configProtectionProvider"
        if (string.IsNullOrEmpty(key)||ConfigurationManager.AppSettings[key]==null) return string.Empty;
        return  ConfigurationManager.AppSettings[key];
    }
    改进后的方法(不直接使用ConfigurationManagerAppSettings属性而是打开配置文件再进行访问及读写操作):
    /// <summary>
    /// 获取配置文件指定的值
    /// </summary>
    /// <param name="key"></param>
    /// <returns>健值</returns>
    public static string GetConfig(string key)
    {
        if (string.IsNullOrEmpty(key)) return string.Empty;
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        if (config.AppSettings.Settings[key] == null)
            return string.Empty;
        else
            return config.AppSettings.Settings[key].Value;
    }
    自己写的ConfigHelp类: 
    /******************************************************************
     * 创建人:HTL
     * 创建时间:2013-2-21 16:58:54
     * 说明:配置文件操作类(Winform,Asp.net)
     * Email:huangyuan413026@163.com
     *******************************************************************/
    using System;
    using System.Configuration;
    namespace HTL
    {
        public sealed class ConfigHelp
        {
            #region appSettings节点
            /// <summary>
            /// 获取配置文件指定的值
            /// </summary>
            /// <param name="key"></param>
            /// <param name="defaultvalue">值为Null时返回的默认值</param>
            /// <returns>健对应的值,如果为Null返回默认值</returns>
            public static string GetConfig(string key, string defaultvalue)
            {
                string _value = GetConfig(key);
                return string.IsNullOrEmpty(_value) ? defaultvalue : _value;
            }
            /// <summary>
            /// 获取配置文件指定的值
            /// </summary>
            /// <param name="key"></param>
            /// <returns>健对应的值</returns>
            public static string GetConfig(string key)
            {
                if (string.IsNullOrEmpty(key)) return string.Empty;
                Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                try
                {
                    if (config.AppSettings.Settings[key] == null)
                        return string.Empty;
                    else
                        return config.AppSettings.Settings[key].Value;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
            /// <summary>
            /// appSettings节点下是否存在某健
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public static bool IsExistKey(string key)
            {
                if (string.IsNullOrEmpty(key)) return false;
                Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                return config.AppSettings.Settings[key] != null;
            }
    
            /// <summary>
            /// 对appSettings节点添加健值
            /// 如果健已经存在则更改值
            /// 添加后重新保存并刷新该节点
            /// </summary>
            /// <param name="key">添加的健</param>
            /// <param name="key">添加的值</param>
            public static void AddConfig(string key, string value)
            {
                if (string.IsNullOrEmpty(key)) return;
                Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                try
                {
                    if (IsExistKey(key))
                        configuration.AppSettings.Settings[key].Value = value;
                    else
                        configuration.AppSettings.Settings.Add(key, value);
    
                    configuration.Save();
                }
                catch (Exception)
                {
                    throw;
                }
                ConfigurationManager.RefreshSection("appSettings");
            }
            /// <summary>
            /// 对appSettings节点添加健值,一次添加或更改多个健值
            /// 如果健已经存在则更改值
            /// 添加后重新保存并刷新该节点
            /// 默认不加密该appSettings节点数据
            /// </summary>
            /// <param name="dict">添加的健值集合</param>
            public static void AddConfig(System.Collections.Generic.Dictionary<string, string> dict)
            {
                AddConfig(dict, false);
            }
            /// <summary>
            /// 对appSettings节点添加健值
            /// 如果健已经存在则更改值
            /// 添加后重新保存并刷新该节点
            /// 加密后的配置节不能通过ConfigurationManager.AppSettings[key]进行访问,否则会产生错误"无法识别的属性 configProtectionProvider"
            /// 可以通过Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings.Settings[key]进行访问
            /// </summary>
            /// <param name="dict">添加的健值集合</param>
            /// <param name="isProtected">是否加密appSettings节点数据,如果为TrueappSettings节点下所有数据都会被加密</param>
            public static void AddConfig(System.Collections.Generic.Dictionary<string, string> dict, bool isProtected)
            {
                if (dict == null || dict.Count <= 0) return;
                Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                #region  //循环添加或更改健值
                foreach (System.Collections.Generic.KeyValuePair<string, string> key_value in dict)
                {
                    if (string.IsNullOrEmpty(key_value.Key)) continue;
                    if (IsExistKey(key_value.Key))
                        configuration.AppSettings.Settings[key_value.Key].Value = key_value.Value;
                    else
                        configuration.AppSettings.Settings.Add(key_value.Key, key_value.Value);
                }//end foreach
                #endregion
                #region 保存配置文件
                try
                {
                    //加密配置信息
                    if (isProtected && !configuration.AppSettings.SectionInformation.IsProtected)
                    {
                        configuration.AppSettings.SectionInformation.ForceSave = true;
    
                        configuration.AppSettings.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
                    }
                    configuration.Save();
    
                }
                catch (Exception)
                {
                    throw;
                }
                ConfigurationManager.RefreshSection("appSettings");
                ConfigurationManager.RefreshSection("configuration");
                #endregion
            }
            /// <summary>
            /// 删除AppSettings下指定的Name
            /// </summary>
            /// <param name="key">要删除的Name</param>
            /// <returns></returns>
            public static bool Remove(string key)
            {
                if (!IsExistKey(key)) return false;
                Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                configuration.AppSettings.Settings.Remove(key.Trim());
                try
                {
                    configuration.Save();
                    ConfigurationManager.RefreshSection("appSettings");
                    return true;
                }
                catch (Exception)
                {
                    throw;
                }
            }
            #endregion
            #region connectionStrings节点
            /// <summary>
            /// ConnectionStrings.Count
            /// </summary>
            /// <returns></returns>
            public static int GetConnsCount
            {
                get { return ConfigurationManager.ConnectionStrings.Count; }
            }
            /// <summary>
            ///  读取数据库配置文件(connectionStrings节点)
            /// </summary>
            /// <param name="key">健名</param>
            /// <returns></returns>
            public static string GetConnConfig(string key)
            {
                return !string.IsNullOrEmpty(key) && ConfigurationManager.ConnectionStrings[key] != null ? ConfigurationManager.ConnectionStrings[key].ConnectionString : string.Empty;
            }
            /// <summary>
            /// 健不存在或值为Null
            /// </summary>
            /// <param name="key">健名</param>
            /// <returns></returns>
            public static bool GetConfigConnIsNull(string key)
            {
                return string.IsNullOrEmpty(key) || ConfigurationManager.ConnectionStrings[key] == null || string.IsNullOrEmpty(ConfigurationManager.ConnectionStrings[key].ConnectionString);
            }
            /// <summary>
            /// 保存配置数据库连接字符串 
            /// 如果不存在连接字符串,则创建并设置字符串
            /// </summary>
            /// <param name="key">要操作的节点</param>
            /// <param name="value"></param>
            public static void AddConnConfig(string key, string value)
            {
                if (string.IsNullOrEmpty(key)) return;
                Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                if (configuration.ConnectionStrings.ConnectionStrings[key] == null)
                    configuration.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings(key, value));
                else
                {
                    foreach (ConnectionStringSettings conn in configuration.ConnectionStrings.ConnectionStrings)
                    {
                        if (conn.Name != key || conn.ConnectionString == value) continue;
                        conn.ConnectionString = value;
                        break;
                    }
                }
                try
                {
                    configuration.Save();
                }
                catch (Exception)
                {
                    throw;
                }
                ConfigurationManager.RefreshSection("connectionStrings");
            }
            #endregion
        }
    }
    View Code
    MSDN加密配置文件:
     
     
  • 相关阅读:
    Cocos2d-x场景生命周期函数介绍
    一致性hash算法在memcached中的使用
    linux操作系统下查看某rpm包是32bit 还是x64bit的命令
    JavaScript与Java通信
    DevExpress2011控件教程)编辑控件(comboBox,AspxCheckBox) 范例1
    Tips:javascript 图片放大和取得尺寸
    Eclipse颜色主题插件-Eclipse Color Theme
    Android Fragment 详解(一)
    《火球——UML大战需求分析》(第1章 大话UML)——1.4 如何学好UML?
    java.lang.UnsatisfiedLinkError: Native method not found 三种可能解决方案
  • 原文地址:https://www.cnblogs.com/huangtailang/p/3940011.html
Copyright © 2020-2023  润新知