ConfigurationSection类使用心得

ConfigurationSection类主要是方便我们用于扩展自定义webcongfig中的节点信息。我们可以方便的通过以下方式获取【自定义节点对象】

【你自定义的对象】 config = (【你自定义的对象】)ConfigurationManager.GetSection("【你自定义的节点名称,如果是sectiongroup的话,请使用XPATH方式】");

使用自定义节点,可能会涉及到这几个对象的使用:ConfigurationSection【配置域】、ConfigurationElement【节点】、ConfigurationElementCollection【节点列表】

用法一: 配置如下webconfig自定义信息,注意order和lineItem节点都是允许重复出现的 

 1<?xml version="1.0" encoding="utf-8" ?>
 2<configuration>
 3  <configSections>
 4    <section name="orders" type="ConsoleTest.OrdersSection, ConsoleTest"/>
 5  </configSections>
 6  <orders companyID="2001">
 7    <order number="100001" amount="222.22">
 8      <lineItems warehouseNumber="02">
 9        <lineItem number="00-000-001" description="wii"/>
10      </lineItems>
11    </order>
12    <order number="300001" amount="33.33">
13      <lineItems warehouseNumber="99">
14        <lineItem number="00-000-001" description="xbox 360"/>
15        <lineItem number="00-000-003" description="playstation 3"/>
16      </lineItems>
17    </order>
18  </orders>
19</configuration>

下面我们要定义相应的实体对象,该实体对象中会有一个子对象【用来表示节点列表信息】(ConfigurationElementCollection)

 public class OrdersSection : ConfigurationSection
    {
        [ConfigurationProperty("companyID", IsRequired = true)]
        public string CompanyID
        {
            get
            {
                return (string)base["companyID"];
            }
            set
            {
                base["companyID"] = value;
            }
        }

        [ConfigurationProperty("", IsDefaultCollection = true)]
        public OrderElementCollection Orders
        {
            get
            {
                return (OrderElementCollection)base[""];
            }
        }
    }

 接下来我们在看看节点列表对象的定义,其中会包含一个子对象【ConfigurationElementCollection】

public class OrderElementCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new OrderElement();
        }
        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((OrderElement)element).Number;
        }

        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.BasicMap;
            }
        }
        protected override string ElementName
        {
            get
            {
                return "order";
            }
        }

        public OrderElement this[int index]
        {
            get
            {
                return (OrderElement)BaseGet(index);
            }
            set
            {
                if (BaseGet(index) != null)
                {
                    BaseRemoveAt(index);
                }
                BaseAdd(index, value);
            }
        }
    }

 那么我们再看看节点对象的定义

public class OrderElement : ConfigurationElement
    {
        [ConfigurationProperty("number", IsRequired = true)]
        public string Number
        {
            get
            {
                return (string)base["number"];
            }
            set
            {
                base["number"] = value;
            }
        }

        [ConfigurationProperty("amount", IsRequired = true)]
        public double Amount
        {
            get
            {
                return (double)base["amount"];
            }
            set
            {
                base["amount"] = value;
            }
        }

        [ConfigurationProperty("lineItems", IsDefaultCollection = true)]
        public LineItemElementCollection LineItems
        {
            get
            {
                return (LineItemElementCollection)base["lineItems"];
            }
        }
    }

另外,还有一个子节点列表对象需要定义,【LineItemElementCollection】(ConfigurationElementCollection)

 public class LineItemElementCollection : ConfigurationElementCollection
    {
        [ConfigurationProperty("warehouseNumber", IsRequired = true)]
        public string WarehouseNumber
        {
            get
            {
                return (string)base["warehouseNumber"];
            }
            set
            {
                base["warehouseNumber"] = value;
            }
        }

        protected override ConfigurationElement CreateNewElement()
        {
            return new LineItemElement();
        }
        protected override object GetElementKey(ConfigurationElement element)
        {
            return ( (LineItemElement)element ).Number;
        }

        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.BasicMap;
            }
        }
        protected override string ElementName
        {
            get
            {
                return "lineItem";
            }
        }

        public LineItemElement this[int index]
        {
            get
            {
                return (LineItemElement)BaseGet(index);
            }
            set
            {
                if (BaseGet(index) != null)
                {
                    BaseRemoveAt(index);
                }
                BaseAdd(index, value);
            }
        }
    }

当然我们还得再定义一个节点对象【LineItemElement

 public class LineItemElement : ConfigurationElement
    {
        [ConfigurationProperty("number", IsKey=true, IsRequired = true)]
        public string Number
        {
            get
            {
                return (string)base["number"];
            }
            set
            {
                base["number"] = value;
            }
        }

        [ConfigurationProperty("description", IsRequired = true)]
        public string Description
        {
            get
            {
                return (string)base["description"];
            }
            set
            {
                base["description"] = value;
            }
        }
    }

这样我们就完成了webconfig节点的自定义和对象的实体化, 我们在使用的使用值需要简单的代码就能获取到相应对象的实体信息;如:

OrdersSection config = (OrdersSection)ConfigurationManager.GetSection("orders");

另一中用法:sectionGroup 配置 。如要配置出如下webconfig信息

 <configSections>
    <sectionGroup name="mygroup">
      <section name="mysection"
                       type="ConfigSection"
                        allowDefinition="Everywhere"
                         allowLocation="true"/>
    </sectionGroup>
  </configSections>

  <mygroup>
    <mysection  user="用户" password="密码">
      <element element1="属性1" element2="属性2"></element>
    </mysection>
  </mygroup>

 那么我们看下实体是如何定义的 。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// ConfigSection 的摘要说明
/// </summary>
public class ConfigSection:ConfigurationSection
{
    public ConfigSection()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }
[ConfigurationProperty("user",DefaultValue="yanghong",IsRequired=true)]
    public string User
    {
        get { return (string)this["user"]; }
        set { this["user"] = value; }
    }

    [ConfigurationProperty("password",DefaultValue="password",IsRequired=true)]
    public string PassWord
    {
        get {  return (string)this["password"]; }
        set { this["password"] = value; }
    }

    [ConfigurationProperty("element")]
    public elementinfo Element
    {
        get { return  (elementinfo)this["element"]; }
        set {this["element"] = value; }
    }
}

上面的实体对象包含一个节点对象信息,我们看下这个对象是如何定义的 。

public class elementinfo : ConfigurationElement
{
    public elementinfo()    { }


    [ConfigurationProperty("element1", DefaultValue = "element1", IsRequired = true)]
    public string Element1
    {
        get { return (string)this["element1"]; }
    }

    [ConfigurationProperty("element2",DefaultValue="element2",IsRequired=true)]
    public string Element2
    {
        get { return (string)this["element2"]; }
    }


}

代码的调用就相当简单了 :

ConfigSection config = (ConfigSection)ConfigurationManager.GetSection("mygroup/mysection");
    Response.Write("用户名:"+config.User.ToString() + "密码:" + config.PassWord.ToString() + "元素属性:" + config.Element.Element1.ToString() + config.Element.Element2.ToString());

转载于:https://www.cnblogs.com/sjqq/p/6434530.html

<think>好的,我现在需要回答用户关于Windows任务计划程序返回代码2147942402的问题。首先,我需要理解这个错误代码的具体含义。用户提供的引用中提到了错误值2147942402,而引用[4]提到返回代码为2,并指出最小支持的服务器是Windows Server 2008。可能这两个代码之间有关联。 我记得Windows系统通常使用十六进制错误代码,但任务计划程序返回的有时是十进制数字。所以需要将十进制的2147942402转换为十六进制。用计算器转换的话,2147942402转换成十六进制是0x80070002。这个代码看起来像是系统错误代码。接下来,我需要确认0x80070002代表什么错误。 查阅资料,系统错误代码0x80070002通常对应的是“系统找不到指定的文件”。也就是说,当任务计划程序尝试执行某个任务时,无法找到指定的脚本或可执行文件路径。这可能是因为路径错误、文件被移动或删除,或者权限问题导致无法访问文件。 用户的引用[1]提到任务路径是“\Microsoft\get_cpu_usage_log”,可能存在路径格式问题。正确的路径应该包含完整的绝对路径,并且需要确保任务计划程序有权限访问该路径。引用[3]也提到执行bat脚本返回0x1,通常与路径或脚本内部错误有关,所以类似的问题可能适用。 总结起来,错误代码2147942402(0x80070002)表示文件未找到。用户需要检查任务配置中的操作路径是否正确,确保文件存在,并且任务计划程序有足够的权限访问该文件。同时,引用[2]提到的确保Task Scheduler服务已启动也很重要,如果服务未运行,任务自然无法执行。 接下来,生成相关问题时需要考虑用户可能的后续疑问,比如如何转换错误代码、如何检查文件路径、权限设置方法等。确保问题覆盖错误处理的不同方面,帮助用户全面排查问题。</think>任务计划程序返回代码$2147942402$的十六进制表示为$0x80070002$,对应系统错误代码**ERROR_FILE_NOT_FOUND**,表示系统找不到指定的文件或路径[^4]。 ### 具体原因分析: 1. **脚本/程序路径错误** 任务配置中"操作"选项卡的路径未指向真实存在的文件,例如: - 路径包含多余空格或拼写错误 - 使用了相对路径而非绝对路径 - 文件被移动或删除 2. **权限问题** 即使路径正确,若任务计划程序未获得以下权限仍会报错: - 未勾选"不管用户是否登录都要运行" - 未选择"使用最高权限运行" - 用户账户无目标文件的读取权限 3. **依赖环境缺失** 执行Python脚本时可能缺少: - Python解释器未加入系统PATH - 脚本依赖第三方库未安装 - 未指定完整解释器路径如`C:\Python39\python.exe` ### 解决方法: ```bat :: 正确路径示例(bat文件) @echo off "C:\Python39\python.exe" "D:\scripts\get_cpu_usage_log.py" ``` 1. 检查任务属性的"常规"选项卡: - 勾选"使用最高权限运行" - 选择配置为当前系统版本(如Windows Server 2008 R2)[^2] 2. 验证服务状态: ```powershell Get-Service Schedule | Start-Service # 启动Task Scheduler服务 ``` 3. 手动测试执行: ```cmd schtasks /run /tn "\Microsoft\get_cpu_usage_log" # 触发任务立即执行 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值