在使用.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: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 <= ) 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加密配置文件:
 
 

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

  1. 无法识别的属性 configProtectionProvider的解决方案

    用RsaProtectedConfigurationProvider加密数据库连接字符串时,只要App.config有任何改动,都会提示无法识别的属性 configProtectionProvider ...

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

    本文导读:网站发布后,在IIS中浏览的时候出现以下异常:无法识别的属性“targetFramework”,请注意属性名称区分大小写.出现这个问题是由IIS配置该站点的.NET Framework 版本 ...

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

    “/CRM”应用程序中的服务器错误. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法识别的属性“targetF ...

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

    当我把我做的网站放在IIS7.0的服务器上的时候,浏览时提示这个错误信息 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消 ...

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

    转自:http://blog.sina.com.cn/s/blog_48964b12010157p0.html 配置错误说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息 ...

  6. 无法识别的属性“targetFramework”

    问题描述:无法识别的属性“targetFramework”.请注意属性名称区分大小写. 解决办法:修改.NET Framework 版本为相应版本即可,例如2.0换成4.0. 参考:http://bl ...

  7. 无法识别的属性“targetFramework”。请注意,属性名是大写和小写。错误的解决方案

    "/CRM"应用server错. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查以下的特定错误具体信息并适当地改动配置文件. 分析器错误消息: 无法识别的属性 ...

  8. selenium中webdriver识别class属性多个值中有空格的解决方案

    初学自动化测试,貌似大家十有八九都是用百度网站进行练手的,特此感谢百度. http://www.baidu.com 页面中主要就是搜索框和提交按钮: 输入框各元素属性:<input id=&qu ...

  9. IIS发布网站,访问时出现无法识别的属性“targetFramework”错误

    今天在IIS发布网站后,访问时出现无识别的属性“targetFramework”错误 错误描述: 错误原因: 是由IIS配置该站点的.NET Framework 版本与程序中的.NET Framewo ...

随机推荐

  1. IntelliJ IDEA 编译程序出现 非法字符 的 解决方法(转)

    百度到很多方法,比如(删了文件重新建:先改成GBK再UTF8:粘贴到notpad++上改utf8),但都没有解决问题.下面这种方法确实有效,先记下来,如果有其他好方法将来在补充…… 文章来源:  ht ...

  2. Android中由Handler和内部类引起的内存泄漏

    原文地址:http://johnnyshieh.github.io/android/2015/09/03/android-handler-memory-leak/ 在Android中我们经常用Hand ...

  3. Python类总结-描述符__get__(),__set__(),__delete__()

    1 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),set(),delete()中的一个,这也被称为描述符协议 get():调用一个属性时,触发 set():为一 ...

  4. Python之路【第六篇】:模块与包

    目录 一 模块 3.1 import 3.2 from ... import... 3.3 把模块当做脚本执行 3.4 模块搜索路径 3.5 编译python文件 3.6  标准模块 3.7  dir ...

  5. python虚拟环境virtualenv下安装MySQL-python

    1.先在windows安装:https://github.com/konglingxi/mysqldb_for_python27 2.按照提示将python主环境中的mysqldb相关文件及文件夹移到 ...

  6. Linux下sublime的中文输入问题

    比较久了,今天找到了解决方案: git clone https://github.com/lyfeyaj/sublime-text-imfix.git cd sublime-text-imfix &a ...

  7. 设计模式 -- 桥接模式(Bridge)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初始桥接模式 ...

  8. ACM -- 算法小结(五)字符串算法之Sunday算法

    1. Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法. 2. Sunday算法其实思想跟BM算法很相似,只不过Sunday算法是从前往后匹配, 在匹 ...

  9. [转]如何卸载eclipse中的ADT

      卸载ADT的方法,方法如下:1.选择Help>Install New Software:2.在"Details" 面板中, 点击"What is already ...

  10. HTML、XML、XHTML 有什么区别?

    HTML即是超文本标记语言(Hyper Text Markup Language),是最早写网页的语言,但是由于时间早,规范不是很好,大小写混写且编码不规范,是语法较为松散的.不严格的Web语言 XH ...