1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
在上述代码中,通过ConfigurationManager.AppSettings从web.config文件中读取配置值。AppName和PortNumber属性用于在页面中展示读取到的配置信息。OnGet方法在页面加载时被调用,负责从配置文件中获取数据 。
同时,在 “Index.cshtml” 文件中添加如下代码,用于展示配置信息:
@page
@model WebAppConfigDemo.Pages.IndexModel
@{
ViewData["Title"] = "首页";
}
应用程序名称: @Model.AppName
监听端口: @Model.PortNumber
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
这段代码通过@Model来访问IndexModel中的属性,将从配置文件中读取到的应用程序名称和监听端口展示在页面上 。
3.2.3 生成并配置 web.config 文件
若项目基于ASP.NET Core,在项目创建完成后,根目录下会自动生成web.config文件(若没有,可手动添加)。若基于传统的ASP.NET Web Forms,同样会自动生成web.config文件。
为web.config文件添加如下内容:
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
在这段配置中,节点的作用与app.config中的类似,用于存储键值对形式的配置信息。节点则是ASP.NET 应用程序特有的配置节点,其中标签用于配置编译相关的设置,debug="true"表示启用调试模式,在开发过程中便于调试代码;targetFramework指定了应用程序所使用的.NET Framework 版本。标签用于配置ASP.NET 应用程序的运行时设置,targetFramework同样指定了.NET Framework 版本 。
四、深入剖析配置文件关键节点
4.1 appSettings 节点
在 C# 的配置文件中,节点就像一个灵活的 “小仓库”,专门用于存储各种简单的配置数据。它以键值对的形式组织信息,使得我们能够轻松地定义和获取应用程序所需的配置项。比如,在一个图片处理应用中,可以在节点中设置默认的图片保存路径。在app.config或web.config文件里添加如下配置:
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
在代码中,通过以下方式获取该配置值:
using System.Configuration;
string savePath = ConfigurationManager.AppSettings["DefaultImageSavePath"];
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
这样,在应用程序的不同地方,都能方便地使用这个配置值,当需要修改默认保存路径时,直接在配置文件中更改即可,无需重新编译代码。
4.2 connectionStrings 节点
节点对于需要与数据库交互的应用程序而言,堪称重中之重。它专门用于定义数据库连接字符串,这些连接字符串包含了连接数据库所需的关键信息,如数据库服务器地址、数据库名称、用户名、密码等。以连接 SQL Server 数据库为例,在web.config文件中可以这样配置:
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
在上述配置中,name属性为连接字符串指定了一个唯一的名称,方便在代码中引用;connectionString属性详细定义了连接数据库的各项参数;providerName指定了数据库提供程序 。
在代码中,通过如下方式获取并使用该连接字符串:
using System.Configuration;
using System.Data.SqlClient;
string connectionString = ConfigurationManager.ConnectionStrings["MyDbConnection"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
// 执行数据库操作
string query = "SELECT * FROM YourTable";
SqlCommand command = new SqlCommand(query, connection);
connection.Open();
// 处理查询结果
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
// 读取数据
}
reader.Close();
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
正确配置节点,能够确保应用程序与数据库之间稳定、准确地连接,为数据的存储和读取提供坚实的基础。
4.3 system.web 节点(针对ASP.NET 应用)
节点是ASP.NET 应用程序配置的核心部分,它涵盖了 Web 应用程序运行的各个关键方面。
在编译设置方面,通过子节点进行配置。例如:
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
这里debug="true"表示在开发阶段启用调试模式,便于及时发现和解决代码中的问题;targetFramework指定了应用程序所使用的.NET Framework 版本。子节点用于添加应用程序所需的程序集引用 。
在身份验证方面,节点也起着关键作用。以表单身份验证为例,配置如下:
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
上述配置中,mode="Forms"指定了使用表单身份验证模式,loginUrl指定了登录页面的 URL,timeout设置了用户登录后的超时时间 。
此外,节点还可以配置授权规则、会话状态、页面处理等众多与 Web 应用程序运行密切相关的设置,全面掌控着ASP.NET 应用程序的行为和性能。
五、熟练掌握配置文件的使用技巧
5.1 读取配置文件中的信息
在 C# 中,读取配置文件中的信息是极为常见的操作。最常用的方式便是借助System.Configuration.ConfigurationManager类。例如,当我们想要读取appSettings节点中的配置值时,假设在app.config或web.config文件中有如下配置:
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
在代码中,通过以下方式轻松获取:
using System.Configuration;
string server = ConfigurationManager.AppSettings["DatabaseServer"];
string database = ConfigurationManager.AppSettings["DatabaseName"];
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
对于connectionStrings节点中的数据库连接字符串,若配置如下:
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
则在代码中使用如下方式读取:
using System.Configuration;
using System.Data.SqlClient;
string connectionString = ConfigurationManager.ConnectionStrings["MyDbConnection"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
// 执行数据库操作
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
此外,在ASP.NET Core 项目中,还可以通过依赖注入的方式获取配置信息。首先,在Startup.cs文件中配置服务:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
services.AddSingleton(config);
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
然后,在需要使用配置信息的类中,通过构造函数注入IConfiguration:
public class MyService
{
private readonly IConfiguration _config;
public MyService(IConfiguration config)
{
_config = config;
}
public void DoSomething()
{
string value = _config["SomeSetting"];
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
5.2 更新配置文件(谨慎操作)
在运行时更新配置文件虽然可行,但务必谨慎为之,因为这一操作可能会引发应用程序的不稳定。在传统的 C# 项目中,若要更新app.config或web.config文件,可以使用System.Configuration.ConfigurationManager.OpenExeConfiguration方法。例如,将appSettings节点中的AppName配置值进行更新:
using System.Configuration;
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["AppName"].Value = "新的应用名称";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
上述代码中,首先打开配置文件,接着修改指定配置项的值,随后保存更改,并刷新appSettings节,使修改后的配置能够立即生效。
在ASP.NET Core 项目中,更新配置文件的方式稍有不同。假设配置文件为appsettings.json,要更新其中的配置值,可以通过以下步骤:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
using System.IO;
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
var appSettingsSection = config.GetSection("AppSettings");
appSettingsSection["SomeSetting"] = "新的值";
var jsonConfig = JsonConvert.SerializeObject(config.AsEnumerable());
File.WriteAllText("appsettings.json", jsonConfig);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
在此过程中,先构建配置对象,获取需要更新的配置节,修改配置值后,将配置对象重新序列化为 JSON 格式,并写回配置文件。不过,在实际应用中,尤其是在生产环境下,这种直接在运行时更新配置文件的操作应经过充分的测试和评估,以避免对应用程序的正常运行造成不良影响。
六、其他进阶配置选项拓展
6.1 自定义配置节
在实际的项目开发中,有时现有的标准配置节点无法满足复杂的业务需求,这时自定义配置节就派上了用场。自定义配置节允许我们根据项目的特定需求,灵活地定义和组织配置信息。
实现自定义配置节主要分为两个关键步骤。首先,需要编写一个配置节处理器类。这个类要继承自ConfigurationSection类,通过它来定义我们所需的配置属性。例如,我们创建一个用于管理系统用户权限配置的类:
using System.Configuration;
public class UserPermissionsSection : ConfigurationSection
{
[ConfigurationProperty("adminPermissions", IsRequired = true)]
public string AdminPermissions
{
get { return (string)this["adminPermissions"]; }
set { this["adminPermissions"] = value; }
}
[ConfigurationProperty("userPermissions", IsRequired = true)]
public string UserPermissions
{
get { return (string)this["userPermissions"]; }
set { this["userPermissions"] = value; }
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
在上述代码中,UserPermissionsSection类定义了两个属性adminPermissions和userPermissions,用于存储管理员和普通用户的权限信息。ConfigurationProperty特性用于指定属性的相关配置,如是否为必需属性等 。
接着,在app.config或web.config文件中声明这个自定义配置节。在文件的节点内添加如下内容:
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
这里的name属性指定了在配置文件中引用该配置节时使用的名称,type属性指定了配置节处理器类的完整命名空间和所在程序集名称。随后,在节点下添加自定义配置节的具体配置:
FullAccess
LimitedAccess
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
这样,在代码中就可以通过ConfigurationManager.GetSection方法获取自定义配置节的信息,并进行相应的处理。例如:
UserPermissionsSection userPermissions = (UserPermissionsSection)ConfigurationManager.GetSection("userPermissions");
string adminPermissions = userPermissions.AdminPermissions;
string userPermissionsValue = userPermissions.UserPermissions;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
6.2 加密配置文件敏感信息
在当今注重数据安全的环境下,配置文件中的敏感信息,如数据库连接字符串、API 密钥等,一旦泄露,可能会给应用程序带来严重的安全风险。因此,对配置文件中的部分或全部内容进行加密就显得尤为重要。
在 C# 中,可以借助aspnet_regiis.exe工具来实现配置文件的加密。以加密web.config文件中的节点为例,在命令提示符中,切换到.NET Framework对应的版本目录(例如C:\Windows[Microsoft.NET](http://Microsoft.NET)\Framework\v4.8.04084),然后执行以下命令:
aspnet_regiis -pe "connectionStrings" -app "/YourApplicationName" -prov "DataProtectionConfigurationProvider"
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
上述命令中,-pe表示加密操作,"connectionStrings"指定了要加密的节点名称,-app指定了应用程序的虚拟路径,-prov指定了加密提供程序。执行该命令后,web.config文件中的节点内容将被加密,加密后的内容类似如下:
...
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
当应用程序运行时,.NET 会自动使用指定的加密提供程序对加密内容进行解密,开发人员在代码中无需额外编写解密代码,就可以像往常一样通过ConfigurationManager.ConnectionStrings获取连接字符串 。
如果需要对app.config文件进行加密,由于aspnet_regiis.exe工具主要针对web.config,可以先将app.config重命名为web.config,执行加密操作后再改回原名。同时,在实际应用中,要妥善保管加密密钥,避免密钥泄露导致加密失去意义。例如,可以将密钥存储在安全的服务器配置中,只有授权的系统管理员才能访问。
七、总结回顾
在本次 C# 配置文件的探索之旅中,我们深入了解了 app.config 和 web.config 的诸多奥秘。从它们的基础定义、创建与配置方法,到关键节点的剖析,再到读取、更新以及进阶的自定义配置节和加密敏感信息等操作,每一步都为我们在 C# 应用开发中灵活管理配置提供了有力支持。
这两个配置文件就如同开发中的得力助手,让我们能够轻松应对各种配置需求,无论是简单的应用程序设置,还是复杂的数据库连接、安全配置等。希望大家在今后的 C# 开发项目中,能够熟练运用这些知识,根据项目的实际需求,巧妙地配置 app.config 和 web.config,为打造高效、稳定且安全的应用程序奠定坚实的基础。让我们在代码的世界里,借助配置文件的力量,创造出更加优秀的软件作品 。
data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/weixin_44064908/article/details/145145444","extend1":"pc","ab":"new"}">>
id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type1" id="blog_extension">
class="blog_extension_card" data-report-click="{"spm":"1001.2101.3001.6470"}" data-report-view="{"spm":"1001.2101.3001.6470"}">
class="blog_extension_card_left">
class="blog_extension_card_cont">
class="blog_extension_card_cont_l">
步步为营DotNet
class="blog_extension_card_cont_r">
微信公众号
.net开发、WPF开发、CSharp程序开发
评论记录:
回复评论: