winform及asp.net访问及修改配置文件

一.基础 >>>

 

1.配置文件概述: 

  应用程序配置文件是标准的 XML文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。配置文件的根节点是configuration。我们经常访问的是appSettings,它是由.Net预定义配置节。我们经常使用的配置文件的架构是象下面的形式。先大概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。

  常见配置文件模式:

<configuration>

        <configSections>           //配置节声明区域,包含配置节和命名空间声明

             <section>                          //配置节声明

                    <sectionGroup>         //定义配置节组

                           <section>                          //配置节组中的配置节声明

       <appSettings>                   //预定义配置节,针对整个程序的配置

       <Custom element for configuration section>        //配置节设置区域

       <userSetting>                    //针对当前用户的配置

 

2.只有appSettings节的配置文件及访问方法

 

  下面是一个最常见的应用程序配置文件的例子,只有appSettings节。

       <?xml version="1.0" encoding="utf-8"?>

       <configuration>

             <appSettings>

                    <add key="connectionstring" value="User ID=sa;Data Source=.;Password=;

                                                              Initial Catalog=test;Provider=SQLOLEDB.1;" />

                    <add key="TemplatePATH" value="Template" />

             </appSettings>

       </configuration>

 

  下面来看看这样的配置文件如何读取。

      string _connectionString=ConfigurationSettings.AppSettings["connectionstring"];

  使用ConfigurationSettings类的静态属性AppSettings就可以直接读取配置文件中的配置信息。这个属性的类型是NameValueCollection。

 

3.自定义配置文件 

 

3.1 自定义配置节

  一个用户自定义的配置节,在配置文件中分为两部分:一是在<configSections></ configSections>配置节中声明配置节(上面配置文件模式中的“<section>”),另外是在<configSections></ configSections >之后设置配置节(上面配置文件模式中的“<Custom element for configuration section>”),有点类似一个变量先声明,后使用一样。

  声明一个配置文件的语句为:<section name=" " type=" "/> 

  <section>:声明新配置节,即可创建新配置节。

  name:自定义配置节的名称。

  type:自定义配置节的类型,主要包括System.Configuration.SingleTagSectionHandler、System.Configuration.DictionarySectionHandler、System.Configuration.NameValueSectionHandler。

  不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。下面我们就举一个配置文件的例子,让它包含这三个不同的type。

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

       <configSections>

             <section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>

             <section name="Test2" type="System.Configuration.DictionarySectionHandler"/>

             <section name="Test3" type="System.Configuration.NameValueSectionHandler" />

       </configSections>

    

       <Test1 setting1="Hello" setting2="World"/>

       <Test2>

             <add key="Hello" value="World" />

       </Test2>

       <Test3>

              <add key="Hello" value="World" />

       </Test3>    

</configuration>

 

  对上面的自定义配置节进行说明。

  在声明部分使用<section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>,声明了一个配置节,它的名字叫Test1,类型为SingleTagSectionHandler;在设置配置节部分使用<Test1 setting1="Hello" setting2="World"/>设置了一个配置节,它的第一个设置的值是Hello,第二个值是World,当然还可以有更多。其它的两个配置节和这个类似。 

  下面我们看在程序中如何访问这些自定义的配置节。我们用过ConfigurationSettings类的静态方法GetConfig来获取自定义配置节的信息。

       public static object GetConfig(string sectionName);

  下面是访问这三个配置节的代码:

           //访问配置节Test1

            IDictionary IDTest1 = (IDictionary)ConfigurationSettings.GetConfig("Test1");

            string str = (string)IDTest1["setting1"] +" "+(string)IDTest1["setting2"];

            MessageBox.Show(str);        //输出Hello World

 

            //访问配置节Test1的方法2

            string[] values1=new string[IDTest1.Count];

            IDTest1.Values.CopyTo(values1,0);

            MessageBox.Show(values1[0]+" "+values1[1]);    //输出Hello World

            

            //访问配置节Test2

            IDictionary IDTest2 = (IDictionary)ConfigurationSettings.GetConfig("Test2");

            string[] keys=new string[IDTest2.Keys.Count];

            string[] values=new string[IDTest2.Keys.Count];

            IDTest2.Keys.CopyTo(keys,0);

            IDTest2.Values.CopyTo(values,0);

            MessageBox.Show(keys[0]+" "+values[0]);

            

           //访问配置节Test3

            NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3");

            MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]);    //输出Hello World

 

  通过上面的代码可以看出,不同的type通过GetConfig返回类型不同,具体获得配置内容方式也不一样。 配置节处理程序返回类型分别为: 

      SingleTagSectionHandler   Systems.Collections.IDictionary

      DictionarySectionHandler   Systems.Collections.IDictionary

      NameValueSectionHandler   Systems.Collections.Specialized.NameValueCollection

 

3.2 自定义配置节组 

  配置节组是使用<sectionGroup>元素,将类似的配置节分到同一个组中。配置节组声明部分将创建配置节的包含元素,在<configSections>元素中声明配置节组,并将属于该组的节置于<sectionGroup>元素中。下面是一个包含配置节组的配置文件的例子:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

       <configSections>

             <sectionGroup name="TestGroup">

                    <section name="Test" type="System.Configuration.NameValueSectionHandler"/>

             </sectionGroup>

       </configSections>

    

       <TestGroup>

             <Test>

                    <add key="Hello" value="World"/>

             </Test>

       </TestGroup>

</configuration>

 

   下面是访问这个配置节组的代码:

            NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("TestGroup/Test");

            MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]);   //输出Hello World

 

二.app.config/web.config的增、删、改操作 >>>

 

  配置文件,对于程序本身来说,就是基础和依据,其本质是一个xml文件,对于配置文件的操作,从.NET 2.0 开始,就非常方便了,提供了 System [.Web] .Configuration 这个管理功能的NameSpace,要使用它,需要添加对 System.configuration.dll的引用。 

  对于WINFORM程序,使用 System.Configuration.ConfigurationManager; 

  对于ASP.NET程序, 使用 System.Web.Configuration.WebConfigurationManager; 

  对于配置文件内容的读取,真是太普遍不过了,我们以最常见的 AppSettings小节来作为例子。假设有如下的配置文件: 

<?xml version="1.0" encoding="utf-8" ?> 

<configuration> 

       <appSettings> 

             <add key="y" value="this is Y"/> 

       </appSettings> 

</configuration> 

(注意:app.config结构与上面的结构不同,读取方法也不一样)

1. 读取值

      * Asp.Net:System.Web.Configuration.WebConfigurationManager.AppSettings[“y”]; 

      * WinForm:System.Configuration.ConfigurationManager.AppSettings[“y”]; 

2. 添加一项 

      * ASP.NET(需要有写权限)

             Configuration config = WebConfigurationManager.OpenWebConfiguration(null); 

             AppSettingsSection app = config.AppSettings; 

             app.Settings.Add("x", "this is X"); 

             config.Save(ConfigurationSaveMode.Modified); 

      * WinForm

             Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

             AppSettingsSection app = config.AppSettings; 

             app.Settings.Add("x", "this is X"); 

             config.Save(ConfigurationSaveMode.Modified); 

3. 修改一项 

      * Asp.Net

             Configuration config = WebConfigurationManager.OpenWebConfiguration(null); 

             AppSettingsSection app = config.AppSettings; 

             //app.Settings.Add("x", "this is X"); 

             app.Settings["x"].Value = "this is not Y"; 

             config.Save(ConfigurationSaveMode.Modified); 

      * WinForm

             Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

             AppSettingsSection app = config.AppSettings; 

             //app.Settings.Add("x", "this is X"); 

             app.Settings["x"].Value = "this is not Y"; 

             config.Save(ConfigurationSaveMode.Modified); 

4. 删除一项 

      * Asp.Net

             Configuration config = WebConfigurationManager.OpenWebConfiguration(null); 

             AppSettingsSection app = config.AppSettings; 

             app.Settings.Remove("x"); 

             config.Save(ConfigurationSaveMode.Modified); 

      * WinForm

             Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

             AppSettingsSection app = config.AppSettings; 

             app.Settings.Remove("x"); 

             config.Save(ConfigurationSaveMode.Modified);



三.上机操作[vs2005] >>>



1.向项目添加app.config文件: 

  右击项目名称,选择“添加”→“添加新建项”,在出现的“添加新项”对话框中,选择“添加应用程序配置文件”;如果项目以前没有配置文件,则默认的文件名称为“app.config”,单击“确定”。出现在设计器视图中的app.config文件为: 

  <?xmlversion="1.0"encoding="utf-8" ?> 

  <configuration> 

  </configuration> 

  在项目进行编译后,在bin/Debuge文件下,将出现两个配置文件(以本项目为例),一个名为“XXX.EXE.config”,另一个名为“XXX.vshost.exe.config”。第一个文件为项目实际使用的配置文件,在程序运行中所做的更改都将被保存于此;第二个文件为原代码“app.config”的同步文件,在程序运行中不会发生更改。 

 

2.connectionStrings配置节: 

  请注意:如果您的SQL版本为2005 Express版,则默认安装时SQL服务器实例名为localhost/SQLExpress,须更改以下实例中“Data Source=localhost;”一句为“Data Source=localhost/SQLExpress;”,在等于号的两边不要加上空格。 

  <!--数据库连接串--> 

  <connectionStrings> 

          <clear /> 

          <add 

connectionString="Data Source=localhost;Initial Catalog=jxcbook;

                     User ID=sa;password=********" 

provider /> 

  </connectionStrings> 

 

3.appSettings配置节: 

  appSettings配置节为整个程序的配置,如果是对当前用户的配置,请使用userSettings配置节,其格式与以下配置书写要求一样。 

  <!--进销存管理系统初始化需要的参数--> 

  <appSettings> 

  <clear /> 

  <add key="userName" value="" /> 

  <add key="password" value="" /> 

  <add key="Department" value="" /> 

  <add key="returnValue" value="" /> 

  <add key="pwdPattern" value="" /> 

  <add key="userPattern" value="" /> 

  </appSettings> 

 

4.读取与更新app.config 

  对于app.config文件的读写,参照“Read/Write App.Config File with .NET 2.0”一文

【点我进入

。 

  请注意:要使用以下的代码访问app.config文件,除添加引用System.Configuration外,还必须在项目添加对System.Configuration.dll的引用。 

 

4.1 读取connectionStrings配置节 

  ///<summary> 

  ///依据连接串名字connectionName返回数据连接字符串 

  ///</summary> 

  private static string GetConnectionStringsConfig(string connectionName) 

  { 

             string connectionString = 

                       ConfigurationManager.ConnectionStrings[connectionName].ConnectionString.ToString(); 

             Console.WriteLine(connectionString); 

             return connectionString; 

      

4.2 更新connectionStrings配置节 

  ///<summary> 

  ///更新连接字符串 

  ///</summary> 

  ///<param >连接字符串名称</param> 

  ///<param >连接字符串内容</param> 

  ///<param >数据提供程序名称</param> 

  private static void UpdateConnectionStringsConfig

                                         (string newName, string newConString, string newProviderName) 

  { 

         bool isModified = false;             //记录该连接串是否已经存在 

         //如果要更改的连接串已经存在 

         if (ConfigurationManager.ConnectionStrings[newName] != null) 

         { 

               isModified = true; 

           

          //新建一个连接字符串实例 

          ConnectionStringSettings mySettings = 

          new ConnectionStringSettings(newName, newConString, newProviderName); 

          // 打开可执行的配置文件*.exe.config 

          Configuration config = 

                              ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

          // 如果连接串已存在,首先删除它 

          if (isModified) 

         

                config.ConnectionStrings.ConnectionStrings.Remove( newName); 

         

          // 将新的连接串添加到配置文件中. 

          config.ConnectionStrings.ConnectionStrings.Add(mySettings); 

          // 保存对配置文件所作的更改 

          config.Save(ConfigurationSaveMode.Modified); 

          // 强制重新载入配置文件的ConnectionStrings配置节 

          ConfigurationManager.RefreshSection("connectionStrings"); 

  } 

 

4.3读取appStrings配置节 

  ///<summary> 

  ///返回*.exe.config文件中appSettings配置节的value项 

  ///</summary> 

  private static string GetAppConfig(string strKey) 

  { 

          foreach (string key in ConfigurationManager.AppSettings) 

         

                if (key == strKey) 

                

                       return ConfigurationManager.AppSettings[strKey]; 

                

         

          return null; 

  } 

 

4.4更新connectionStrings配置节 

  ///<summary> 

  ///在*.exe.config文件中appSettings配置节增加一对键、值对 

  ///</summary> 

  private static void UpdateAppConfig(string newKey, string newValue) 

  { 

          bool isModified = false; 

          foreach (string key in ConfigurationManager.AppSettings) 

         

                if(key==newKey) 

                

                       isModified = true; 

                

         

          // Open App.Config of executable 

          Configuration config = 

                              ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

          // You need to remove the old settings object before you can replace it 

          if (isModified) 

         

                config.AppSettings.Settings.Remove(newKey); 

         

          // Add an Application Setting. 

          config.AppSettings.Settings.Add(newKey,newValue); 

          // Save the changes in App.config file. 

          config.Save(ConfigurationSaveMode.Modified); 

          // Force a reload of a changed section. 

          ConfigurationManager.RefreshSection("appSettings") ; 

  } 

 

5.加密配置文件 

  此节代码参照Dariush Tasdighi所著文章《Encrypt and Decrypt of ConnectionString in app.config and/or web.config!》【点我进入】。 

  请注意:(1)要使用以下的代码访问app.config文件,除添加引用System.Configuration外,还必须在项目添加对System.Configuration.dll的引用; (2)以下示例代码中的DPAPI提供程序为“DataProtectionConfigurationProvider”,这是一种基于机器名和当前用户密码的加密方式。如果计划在多台服务器(Web 场合)上使用相同的加密配置文件,则只有通过 RSAProtectedConfigurationProvider 才能导出加密密钥,并将其导入其他服务器。(3)加密后的配置文件不需要解密即可用上述方法直接读取。 

 

5.1加密connectionStrings配置节 

  ///<summary> 

  ///加密配置文件中的ConnectionString节 

  ///</summary> 

  ///<param >true为加密,false为解密</param> 

  public static void ConnectionStringProtection( bool protect) 

  { 

          //取得当前程序的执行路径 

          string pathName = Application.ExecutablePath; 

          // 定义Dpapi提供程序的名称. 

          string strProvider = "DataProtectionConfigurationProvider"; 

          System.Configuration.Configuration oConfiguration = null; 

          System.Configuration.ConnectionStringsSection oSection = null; 

          try 

         

                // 打开配置文件,并取得connectionStrings配置节. 

                oConfiguration = 

                              System.Configuration.ConfigurationManager.OpenExeConfiguration(

<param>

true为加密,false为解密</param> );

                public static void AppSettingProtection(bool protect) 

                

                       //取得当前程序的执行路径 

                       string pathName = Application.ExecutablePath; 

                       // Define the Dpapi provider name. 

                       string strProvider = "DataProtectionConfigurationProvider"; 

                       System.Configuration.Configuration oConfiguration = null; 

                       System.Configuration.AppSettingsSection oSection = null; 

                       try 

                       

                              // Open the configuration file and retrieve the connectionStrings section. 

                              oConfiguration = 

                                            System.Configuration.ConfigurationManager.OpenExeConfiguration(pathName); 

                              if (oConfiguration != null) 

                              

                                     bool blnChanged = false; 

                                     oSection = oConfiguration.GetSection("appSettings") as 

                                                                               System.Configuration.AppSettingsSection; 

                                      if (oSection != null) 

                                     

                                            if ((!(oSection.ElementInformation.IsLocked)) 

                                                                        &&(!(oSection.SectionInformation.IsLocked))) 

                                            

                                                   if (protect) 

                                                   

                                                          if (!(oSection.SectionInformation.IsProtected)) 

                                                          

                                                                 blnChanged = true; 

                                                                 // Encrypt the section. 

                                                                 oSection.SectionInformation.ProtectSection(strProv ider); 

                                                          

                                                   

                                                   else 

                                                   

                                                          if (oSection.SectionInformation.IsProtected) 

                                                          

                                                                 blnChanged = true; 

                                                                 // Remove encryption. 

                                                                 oSection.SectionInformation.UnprotectSection(); 

                                                          

                                                   

                                            

                                            if (blnChanged) 

                                            

                                                   // Indicates whether the associated configuration section will be saved even 

                                                   // if it has not been modified. 

                                                   oSection.SectionInformation.ForceSave = true; 

                                                   // Save the current configuration. 

                                                   oConfiguration.Save(); 

                                              

                                     

                              

                       

                       catch (System.Exception ex) 

                       

                              throw (ex); 

                       

                    }

          finally 

         

         

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ASP.NET Core 并不直接支持调用 WinForms 自定义控件,因为 ASP.NET Core 是基于跨平台的开发框架,而 WinForms 是一个基于 Windows 平台的桌面应用程序框架。不过,你可以通过一些技巧来实现在 ASP.NET Core 中使用 WinForms 控件。 一种常见的做法是使用 SignalR 实现实时通信,将 WinForms 控件的 UI 渲染在服务器端,并通过 SignalR 将渲染后的 UI 推送给客户端。这样,客户端就可以通过浏览器访问 ASP.NET Core 应用程序并查看 WinForms 控件的渲染结果。 下面是一个简单的示例,演示如何在 ASP.NET Core 中使用 WinForms 控件: 1. 创建一个 ASP.NET Core Web 应用程序项目。 2. 在项目中添加对 `Microsoft.AspNetCore.SignalR` 的引用。 3. 创建一个名为 `WinFormsService` 的类,用于处理 WinForms 控件的渲染和更新: ```csharp using System; using System.Drawing; using System.Windows.Forms; public class WinFormsService { private readonly HubContext<WinFormsHub> _hubContext; private readonly Control _winFormsControl; public WinFormsService(HubContext<WinFormsHub> hubContext) { _hubContext = hubContext; _winFormsControl = new YourCustomControl(); // 替换为你自己的自定义控件类型 _winFormsControl.Size = new Size(300, 300); _winFormsControl.Paint += WinFormsControl_Paint; } private void WinFormsControl_Paint(object sender, PaintEventArgs e) { // 在控件的绘制事件中渲染 UI,并将渲染结果发送给客户端 using (var bitmap = new Bitmap(_winFormsControl.Width, _winFormsControl.Height)) { _winFormsControl.DrawToBitmap(bitmap, _winFormsControl.ClientRectangle); var imageData = ImageToBase64(bitmap); _hubContext.Clients.All.SendAsync("UpdateWinFormsUI", imageData); } } private string ImageToBase64(Image image) { using (var memoryStream = new MemoryStream()) { image.Save(memoryStream, ImageFormat.Png); var imageDataBytes = memoryStream.ToArray(); return Convert.ToBase64String(imageDataBytes); } } } ``` 4. 创建一个名为 `WinFormsHub` 的 SignalR Hub 类,用于处理客户端的连接和消息: ```csharp using Microsoft.AspNetCore.SignalR; public class WinFormsHub : Hub { public async Task JoinGroup(string groupName) { await Groups.AddToGroupAsync(Context.ConnectionId, groupName); } public async Task LeaveGroup(string groupName) { await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName); } } ``` 5. 在 `Startup.cs` 文件的 `ConfigureServices` 方法中注册服务: ```csharp public void ConfigureServices(IServiceCollection services) { services.AddSignalR(); services.AddSingleton<WinFormsService>(); } ``` 6. 在 `Startup.cs` 文件的 `Configure` 方法中启用 SignalR 终结点: ```csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ... app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapHub<WinFormsHub>("/winformsHub"); // SignalR 终结点 endpoints.MapControllers(); }); } ``` 7. 创建一个名为 `WinFormsController` 的控制器,用于处理客户端的请求: ```csharp [Route("api/[controller]")] [ApiController] public class WinFormsController : ControllerBase { private readonly WinFormsService _winFormsService; public WinFormsController(WinFormsService winFormsService) { _winFormsService = winFormsService; } [HttpGet("start")] public IActionResult Start() { // 启动 WinForms 控件渲染 _winFormsService.StartRendering(); return Ok(); } } ``` 8. 在客户端的 HTML 页面中使用 SignalR 连接并接收来自服务器的渲染结果: ```html <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="/winformsHub/hubs"></script> <script> const connection = new signalR.HubConnectionBuilder() .withUrl("/winformsHub") .build(); connection.on("UpdateWinFormsUI", function (imageData) { // 接收来自服务器的渲染结果,并将其显示在页面上 const imageElement = document.getElementById("winformsImage"); imageElement.src = "data:image/png;base64," + imageData; }); connection.start().then(function () { connection.invoke("JoinGroup", "WinFormsGroup"); }); </script> <img id="winformsImage" src="" alt="WinForms UI"> ``` 以上示例中,`WinFormsService` 类负责渲染 WinForms 控件的 UI,并使用 SignalR 将渲染结果推送给客户端。`WinFormsHub` 类是 SignalR 的 Hub 类,用于处理客户端的连接和消息。`WinFormsController` 类是一个 ASP.NET Core 控制器,用于启动 WinForms 控件的渲染。 请注意,上述示例仅为演示目的,实际应用中可能需要根据具体需求进行修改和扩展。此外,这种方法可能会带来一些性能和安全方面的考虑,请根据实际情况进行评估和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值