在使用.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. Java throw throws try...catch区别

    java里的异常多种多样,这是一种非常有用的机制,它能帮助我们处理那些我们未知的错误,在java里,关于异常的有throw throws,还有一个try catch 程序块.接下来我们挨个看看这几个的 ...

  2. WebApi使用JWT认证(二)

    这是第二部:实现NetCore上的WebApi使用JWT认证 1.NetCore新建一个WebApi的项目 2.打开AppSettings.json,添加Jwt的信息,这里为了演示而已 { " ...

  3. 打开tcp_tw_recycle引起的一个问题

    今天普空说了一个问题就是如果设置了tcp_tw_recycle ,那么如果客户端是NAT出来的,那么就可能会出现连接被直接rst的情况.然后我google了下,在内核列表也有人说了这个问题 https ...

  4. 深入理解javascript作用域系列第四篇

    前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用其他类型的作用域单元甚至可以实现维护起来更加优秀.简洁的 ...

  5. Cable master POJ - 1064

    Inhabitants of the Wonderland have decided to hold a regional programming contest. The Judging Commi ...

  6. 【WIN10】Bind、Binding與Converter的使用

    Demo源碼下載:http://yunpan.cn/cHuCmI4NK4xwr  访问密码 8201 1.Bind Bind的使用方式是: <Button Content="{x:Bi ...

  7. 【BZOJ 2436】 2436: [Noi2011]Noi嘉年华 (区间DP)

    2436: [Noi2011]Noi嘉年华 Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不 ...

  8. 「ZJOI2017」仙人掌

    「ZJOI2017」仙人掌 题目大意: 给定一张无向联通图,求有多少种本质不同的不加重边的加边方案使得新图是个仙人掌. 解题思路: 如果原来的图不是仙人掌,那么答案就是 \(0\) ,否则求出这个仙人 ...

  9. Python入门,以及简单爬取网页文本内容

    最近痴迷于Python的逻辑控制,还有爬虫的一方面,原本的目标是拷贝老师上课时U盘的数据.后来发现基础知识掌握的并不是很牢固.便去借了一本Python基础和两本爬虫框架的书.便开始了自己的入坑之旅 言 ...

  10. sklearn中的超参数调节

    进行参数的选择是一个重要的步骤.在机器学习当中需要我们手动输入的参数叫做超参数,其余的参数需要依靠数据来进行训练,不需要我们手动设定.进行超参数选择的过程叫做调参. 进行调参应该有一下准备条件: 一个 ...