В настоящее время мы используем веб-службу (IBM Message Broker). Поскольку служба все еще находится в разработке, во многих случаях она возвращает недопустимый XML (да, это будет исправлено, я обещаю).
Проблема возникает при вызове этой службы из .NET с использованием клиента, сгенерированного svcutil, с помощью ClientBase<T>
. Похоже, что используемое XmlSerializer
не является ошибкой в недопустимых XML-элементах.
Вот пример того, что не сообщит о неисправности, и просто верните частично инициализированный элемент:
using System;
using System.Diagnostics;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
[Serializable]
public class Program
{
[XmlElement(Order = 0)]
public string One { get;set; }
[XmlElement(Order = 1)]
public string Two { get;set; }
static void Main(string[] args)
{
var ser = new XmlSerializer(typeof(Program));
ser.UnknownElement += (o, e) => {
Console.WriteLine("Unknown element: {0}", e.Element.Name);
};
using (var input = new StringReader(
@"<?xml version=""1.0"" encoding=""utf-8"" ?>
<Program>
<Two>Two</Two>
<One>One</One>
</Program>"))
{
var p = (Program)ser.Deserialize(input);
Debug.Assert(p.One != null);
}
}
}
При подключении к событию UnknownElement
он корректно сообщает о недопустимом XML (порядок элементов не совпадает), но при использовании ClientBase<T>
эти (и некоторые другие случаи) просто игнорируются (как если бы они не использовали ошибку события XmlSerializer
).
Мой вопрос: как я могу сделать ClientBase<T>
обнаружение недопустимого XML? Есть ли способ подключиться к событиям сбоя XmlSerializer
, используемым ClientBase<T>
?
В настоящее время мы должны вручную проверять ответы с использованием SoapUI, если что-то не имеет смысла.
Спасибо