У меня есть wsdl со стороннего сервера. Побежал svcutil и в конечном итоге с набором
XmlNode AMethod(object Request);
методы. Для каждого метода есть отдельный 100-страничный PDF-файл с описанием объектов ответа / запроса
Я думал обернуть веб-методы и использовать XmlSerializer для возврата строго типизированных объектов. Возвращенный XML выглядит следующим образом (я удалил заголовки мыла):
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="ResponseExt"
xmlns="http://www.thirdparty.com/lr/">
<Code>0</Code>
<Message>SUCCESS</Message>
<SessionId>session_token</SessionId>
</Response>
Выглядело просто. Создан класс (из документов / проводных захватов):
[XmlRoot("Response")]
//EDIT added XmlType
[XmlType("ResponseExt", Namespace = "http://www.thirdparty.com/lr/")]
public class MyClass {
public string Code {get; set;}
public string Message {get; set;}
public string SessionId {get; set;}
}
Время обработки:
//XmlNode node = xml from above
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
XmlNodeReader reader = new XmlNodeReader(node);
Myclass myclass = serializer.Deserialize(reader) as MyClass
Последняя строка, где он разрывается с внутренним сообщением об исключении: Указанный тип не был распознан: name = 'ResponseExt', namespace = 'http://www.thirdparty.com/lr/', at <Response xmlns=''
>.
Я не могу понять, как сделать сериализатор счастливым и что именно эти два означают
XSI: тип = "ResponseExt"
XMLNS = "http://www.thirdparty.com/lr/
Как всегда, любые советы и указатели приветствуются
РЕДАКТИРОВАТЬ: Принятый ответ ниже.
Я все еще получал исключение, пока не нашел это, надеюсь, это сэкономит кому-то время.
Я начал работать задом наперед. Захваченный xml на проводе. Десериализован в мои созданные классы с правильными атрибутами: работал как шарм. Попробовал еще раз с веб-сервиса - исключение. По какой-то причине XmlSerializer не распознает ResponseExt.
XmlSerializer serializer = new XmlSerializer(typeof(Response));
XmlNode node = (XmlNode)results[0];
XmlDocument doc = new XmlDocument();
doc.LoadXml(node.OuterXml); //reload node
XmlNodeReader reader = new XmlNodeReader(doc.FirstChild); //there is only one node
Response rsp = serializer.Deserialize(reader) as Response; //works
РЕДАКТИРОВАТЬ: основная проблема файл wsdl не был завершен. Потратив на это 2 дня и найдя этот (уродливый) обходной путь, сторонний поставщик предоставил complete WSDL для всех типов, которые десериализовались без ошибок.