У меня есть wsdl с стороннего сервера. Ran svcutil и закончил с наборомXmlSerializer Deserialize failures
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
Последняя линия, где она взрывается с внутренним сообщением исключения: Указанный тип не был признан: имя = 'ResponseExt', namespace = 'http://www.thirdparty.com/lr/', по адресу <Response xmlns=''
>.
Я не могу понять, как сделать Serializer счастливым и что именно эти два означают
XSI: тип = "ResponseExt" XMLNS = "http://www.thirdparty.com/lr/
Как всегда любые советы и указатель оценены
EDIT:. Принимается ответ ниже
Я все еще получал исключение, пока я не нашел это, надеюсь, что это сэкономит какое-то время. Я начал работать назад. Захваченный xml на проводе. Дезерминирован для моих созданных классов с правильными атрибутами: работал как шарм. Пробовал снова из webservice - исключение. По какой-то причине 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
EDIT: основная проблема wsdl-файл не был заполнен. Проведя 2 дня на этом и обнаружив это (уродливое) обходное решение, сторонний поставщик предоставил полный WSDL со всеми типами, которые десериализуются без ошибок.
нормально, я обновил свой ответ после того, как вы обновили вопрос. – Cheeso