XML HTTP POST интеграция в .NET - PullRequest
3 голосов
/ 08 мая 2009

Я работаю над проектом .NET, который интегрируется с внешней компанией. Эта компания будет отправлять нам XML-сообщения через HTTP POST (необработанный XML, а не SOAP). Есть в основном три разных типа XML-сообщений, которые они будут отправлять нам, у каждого из которых есть свои собственные XSD. Между этими XSD нет иерархии наследования, все они в основном являются отдельными XML-сущностями.

В данный момент мы просто используем класс IHttpHandler .ashx для обработки XML. Мы создали класс из каждого XSD и используем XmlSerializer для преобразования различных сообщений XML в объекты. Это не идеально, потому что нам нужно знать тип сообщения перед созданием соответствующего XmlSerializer для его обработки. В настоящее время мы просто смотрим на имя корневого элемента в сообщении, чтобы выбрать, какой тип передать XmlSerializer.

Должен быть лучший способ сделать это ... Есть ли что-то в WCF, что может сделать это автоматически с простым XML? Или существует XML-сериализатор, который может динамически сериализовать несколько типов? Любые другие предложения?

Ответы [ 5 ]

1 голос
/ 08 мая 2009

Классы Linq to XML очень гибкие и простые в использовании. Вы можете просто создать новый элемент XElement и добавить строку XML.

XElement xml = XElement.Parse(receivedXmlString);

Работа выполнена.

Андерс Хейлсберг представил на MIX07 хорошую сессию на эту тему: « Использование LINQ для значительного улучшения управляемой данными разработки в веб-приложениях ». Возможно, вы найдете это видео полезным. Работа с Linq to XML занимает около 26 минут.

1 голос
/ 08 мая 2009
1 голос
/ 08 мая 2009

Единственная проблема, с которой я столкнулся с XMLSerializer - это то, что он довольно хрупкий. Измените XML для большего количества функций, и вы можете сломать клиентов. Я думаю, что лучше разобрать XML самостоятельно. Может быть, используя Linq XDocument / XElement?

0 голосов
/ 09 мая 2009

Я бы использовал XML Serializer, просто в более общем смысле, чем вы в настоящее время.

Если сообщение может быть одного из трех типов, вы все равно можете использовать XML-сериализатор для автоматического чтения и десериализации - вам не нужно проверять первый элемент, чтобы различать их. Но для этого требуется объединить XSD в один консолидированный XSD, а затем создать единый консолидированный тип «объединения» на стороне .NET. Вы также можете сделать это в обратном порядке, объединяя сгенерированные типы, а затем извлекая сгенерированный XSD из этого с помощью инструмента xsd.exe.

Предполагаемая «хрупкость» XML-сериализатора, по моему мнению, не является проблемой. XML в целом может быть хрупким, если вы используете технологию привязки данных XML, которая зависит от XSD, как и XML-сериализация. Это не XML-сериализация как таковая, она хрупкая. Это схема, которая может быть хрупкой. Подходы, основанные на схемах, включая сериализацию XML в .NET, могут быть хрупкими, если сами схемы не были разработаны с учетом эволюции. Например, правильное использование xsd: any и xsd: xmlAny, тегов версий сообщений и т. Д. Хорошая новость заключается в том, что есть хорошее руководство по разработке гибкой схемы, которая может развиваться изящно.

Однако, это все может быть не проблема, потому что схема уже существует. В любом случае вы не добавите «хрупкость» в систему с помощью XML Serializer.

0 голосов
/ 08 мая 2009

Почему бы не прочитать его в набор данных с помощью XmlReadMode.Auto? Затем у вас есть один объект, который может быть прочитан соответствующим образом - вы можете посмотреть на Таблицу [0], чтобы увидеть, какой у вас есть.

...