在我们的应用程序中,我们有一个保存和读取的自定义配置。我们的问题是这样的:随着产品的发展,一些配置属性不再需要,或者被重命名,或者其他什么。我们产品的早期版本编写的文件中具有这些属性,因此当读取这些文件时,会引发异常 (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”(或者根本不抛出异常)。
谢谢!
戳
通常,这被证明是一个问题,意味着您的部署实践不好。已部署应用程序的配置文件中不应存在残留的、已弃用的配置值。准备进行配置转换并部署您的软件(包括配置文件),问题就会消失。
\n但是,您可以防止抛出异常并继续解析。
\n\n\n\n配置元素/部分公开两个可重写的方法(OnDeserializeUnrecognizedAttribute 和 OnDeserializeUnrecognizedElement),如果解析在解析过程中发现未知元素/属性,则调用这些方法。这些方法可用于支持简单的动态解析。
\n对于未知属性,该方法获取已解析的名称和值。如果该方法返回 true,则子系统假定该属性已被处理,否则将引发异常。
\n
ConfigurationElement.OnDeserializeUnrecognizedAttribute Method (String,\xe2\x80\x82String)因此,在类中重写MySettings : ConfigurationElement并true在您知道调用它的属性已弃用时返回。
所以像这样:
\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n您确实需要进行该检查,但不能只return true针对所有属性,因为这会破坏对真正无效且从未有效的属性的验证。
| 归档时间: |
|
| 查看次数: |
2401 次 |
| 最近记录: |