如何处理配置文件中的未知属性

时间:2016-01-27 22:06:55

标签: .net

在我们的应用程序中,我们有一个自定义配置,我们保存和阅读。我们的问题是:随着产品的发展,不再需要或重命名某些配置属性,或者其他任何配置属性。由我们产品的早期版本编写的文件中包含这些属性,因此在读取这些文件时会抛出异常(ConfigurationErrorsException)。

有没有办法捕获异常以便忽略未知属性?

这是我的意思的一个例子。如果我尝试阅读以下文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="MySettings" type="Config.MySettingsConfiguration, Config, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" allowExeDefinition="MachineToLocalUser" overrideModeDefault="Allow" restartOnExternalChanges="true" requirePermission="true" />
    </configSections>
    <MySettings>
        <MyElement Bogus=""/>
    </MySettings>
</configuration>

和&#34; Bogus&#34;未被定义为&#34; MyElement&#34;的属性,将抛出异常。我希望能够抓住这个例外并忽略&#34; Bogus&#34; (或者没有抛出异常)。

谢谢!

JAB

1 个答案:

答案 0 :(得分:1)

通常情况下,这被证明是一个问题,这意味着您的部署实践并不好。您不应在已部署应用程序的配置文件中包含残留的,已弃用的配置值。准备进行配置转换和部署软件,包括配置文件,问题就会消失。

但是,您可以防止抛出异常并继续解析。

来自Creating Configuration Sections – P3.NET

  

配置元素/部分公开了两个可覆盖的方法(OnDeserializeUnrecognizedAttribute和OnDeserializeUnrecognizedElement),如果解析在解析期间找到未知的元素/属性,则会调用这两个方法。这些方法可用于支持简单的动态解析。

     

对于未知属性,该方法获取已解析的名称和值。如果该方法返回true,则子系统假定该属性已被处理,否则抛出异常。

因此,当您知道不推荐使用它的属性时,请覆盖MySettings : ConfigurationElement类中的ConfigurationElement.OnDeserializeUnrecognizedAttribute Method (String, String)并返回true

这样的事情:

public class MySettings : ConfigurationElement
{
    private string[] _deprecatedAttributes = new[] { "foo", "bar" };

    protected override bool OnDeserializeUnrecognizedAttribute(string attribute, string value)
    {
        if (_deprecatedAttributes.Contains(attribute))
        {
            return true;
        }

        return base.OnDeserializeUnrecognizedAttribute(attribute, value);
    }
}

您确实需要检查,并且您不能只为return true获取所有属性,因为这会破坏对真正无效且永远无效的属性的验证。