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

JAB*_*JAB 3 .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>
Run Code Online (Sandbox Code Playgroud)

并且“Bogus”没有定义为“MyElement”的属性,将会抛出异常。我希望能够捕获此异常并忽略“Bogus”(或者根本不抛出异常)。

谢谢!

Cod*_*ter 5

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

\n

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

\n

创建配置节 \xe2\x80\x93 P3.NET

\n
\n

配置元素/部分公开两个可重写的方法(OnDeserializeUnrecognizedAttribute 和 OnDeserializeUnrecognizedElement),如果解析在解析过程中发现未知元素/属性,则调用这些方法。这些方法可用于支持简单的动态解析。

\n

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

\n
\n

ConfigurationElement.OnDeserializeUnrecognizedAttribute Method (String,\xe2\x80\x82String)因此,在类中重写MySettings : ConfigurationElementtrue在您知道调用它的属性已弃用时返回。

\n

所以像这样:

\n
public class MySettings : ConfigurationElement\n{\n    private string[] _deprecatedAttributes = new[] { "foo", "bar" };\n    \n    protected override bool OnDeserializeUnrecognizedAttribute(string attribute, string value)\n    {\n        if (_deprecatedAttributes.Contains(attribute))\n        {\n            return true;\n        }\n        \n        return base.OnDeserializeUnrecognizedAttribute(attribute, value);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

您确实需要进行该检查,但不能只return true针对所有属性,因为这会破坏对真正无效且从未有效的属性的验证。

\n

  • 我接受你的答案,因为它解决了我的问题。但我对你关于我们“部署实践不好”的断言感到好笑。我们所做的可能是非常规的,但相关文件并未部署。它是在我们的应用程序首次运行时创建的,并由应用程序编写。因此,当我们的应用程序发布新版本时,可能会有一些属性或元素发生变化,这就是为什么我需要知道如何处理它们。感谢您的答复。 (4认同)