我与第三方服务交换文件。所有文档均为 XML 格式。如果出现问题,该服务还会使用特殊的 XML 格式报告错误(我有它的 xsd 模式)。有很多文档格式,但是对于每个请求,我确切地知道响应将具有什么格式(如果没有错误)。
我写了以下方法来检查请求是否成功:
void CheckErrorSchema(string text)
{
var settings = new XmlReaderSettings { ValidationType = ValidationType.Schema };
using (var sr = new StringReader(Properties.Resources.ErrorSchema)) // xsd-схема сообщения об ошибке
using (var xr = XmlReader.Create(sr))
settings.Schemas.Add(null, xr);
using (var sr = new StringReader(text))
using (var xr = XmlReader.Create(sr, settings))
{
try
{
var doc = XDocument.Load(xr);
throw new MyException(...);
}
catch (XmlSchemaValidationException) { }
}
}
那些。收到响应后,我调用这个方法,如果它运行正常,那么我将响应反序列化为我需要的格式。
我不喜欢这样,现在我正在加载一个文档,如果它的加载引发异常,那么我会抑制它,我认为一切都很好。如果文件加载没有问题,那么我会抛出异常。错误非常罕见(约占案例的 1%)。
如何优化?
重写代码如下:
xml与schema不匹配时的扩展方法不会抛出异常,而是调用
Extensions.Validate
回调。XDocument
作为回调,我使用了一个简单的 lambda 表达式来删除错误标志。它并没有变得更快,但至少我摆脱了 VS 诊断窗口中的一堆红色菱形。