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];
}

改进后的方法(不直接使用ConfigurationManager的AppSettings属性而是打开配置文件再进行访问及读写操作):

/// <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:[email protected]
 *******************************************************************/
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
    }
}

MSDN加密配置文件:

http://msdn.microsoft.com/zh-CN/library/ms254494.aspx

http://msdn.microsoft.com/zh-cn/library/53tyfkaw(v=vs.100).aspx

http://www.cnblogs.com/huangtailang/p/3925275.html

来自为知笔记(Wiz)

时间: 2024-10-12 04:40:51

C# 解决无法识别的属性 configProtectionProvider的相关文章

无法识别的属性“targetFramework”。请注意属性名称区分大小写。错误解决办法

"/CRM"应用程序中的服务器错误.配置错误说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法识别的属性"targetFramework".请注意属性名称区分大小写. 源错误: 行 24:             设置为 true. 行 25:         -->行 26: <compilation debug="true" targetFramework

无法识别的属性“targetFramework”的解决方法

本文导读:网站发布后,在IIS中浏览的时候出现以下异常:无法识别的属性“targetFramework”,请注意属性名称区分大小写.出现这个问题是由IIS配置该站点的.NET Framework 版本与程序中的.NET Framework配置的版本不一致引起的,修改.NET Framework 版本为相应版本即可解决 一.无法识别的属性“targetFramework”.请注意属性名称区分大小写 错误如下 “/OA”应用程序中的服务器错误. 配置错误 说明:在处理向该请求提供服务所需的配置文件时

IIS7.0提示---无法识别的属性“targetFramework”。请注意属性名称区分大小写。

当我把我做的网站放在IIS7.0的服务器上的时候,浏览时提示这个错误信息 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法识别的属性“targetFramework”.请注意属性名称区分大小写. 源错误: 行 6: <configuration> 行 7: <system.web> 行 8: <compilation debug="false" strict="

【转】ASP.NET的OnClientClick与OnClick事件【解决了“识别用户在对话框里面选yes或no的问题”】

OnClientClick是客户端事件方法.一般采用JavaScript来进行处理.也就是直接在IE端运行.一点击就运行. OnClick事件是服务器端事件处理方法,在服务器端,也就是IIS中运行.点击按钮后,执行postback,再运行. 如果一个按钮上我们同时有客户端的OnClientClick方法又有OnClick事件处理方法,如何才能按照正常的逻辑运行呢? OnClientClick中我们常用来做一些客户端的检测.当然放在服务器也可以做同样的检测,但这样做的代价是与服务器进行交互,消耗资

分析器错误消息: 无法识别的属性“targetFramework”。请注意属性名称区分大小写。

在用Visual Studio运行代码时出现如下错误 “/”应用程序中的服务器错误. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法识别的属性“targetFramework”.请注意属性名称区分大小写. 源错误: 行 8: <configuration> 行 9: <system.web> 行 10: <compilation debug="true" target

配置iis时,浏览项目提示 无法识别的属性“targetFramework”。请注意属性名称区分大小写。

无法识别的属性“targetFramework”.请注意属性名称区分大小写. 行 12:     </appSettings>行 13:   <system.web>行 14:     <compilation debug="true" targetFramework="4.0" />行 15: 行 16:     <authentication mode="Forms"> 遇到这样的问题,是应用程

解决HTML5中placeholder属性兼容性的JQuery插件

//调用方法 $(function () {   $(".pHolder").jason(); }); //HTML代码 <input type="text" class="pHolder" placeholder="请输入姓名" /> //jquery插件 ($.fn.jason = function(a) {    var b = {        focus: "black",      

Linux下安装Android的adb驱动-解决不能识别的问题

Linux下安装Android的adb驱动-解决不能识别的问题 20141011更新: 老方法对我当时使用的一款设备一直都没有出现问题,最后遇到小米手机还有Android4.4版本的系统都会每次出现error: insufficient permissions for device问题,老方法的最后也说了这个问题的解决方法是什么.大意就是adb服务得以root用户身份启动,比较靠谱的方法是添加或者修改/etc/udev/rules.d/51-android.rules文件,内容如下: SUBSY

Matlab与.NET混合编程解决人脸识别问题

原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html [原创]Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.ht