Какой тип XML подходит для веб-службы?

2

Текущая реализация

База данных Sql Server 2005 с таблицей, называемой сообщениями с столбцом MessageXml типа xml.

Проект библиотеки С# с классом Linq to Sql, который генерирует класс Message с полем MessageXml типа XElement.

WCF Webservice, который предоставляет класс MessagePayload со свойством MessageXml типа XElement.

Вебсервис не обслуживает мой класс сообщений, созданный Linq to Sql. Я использую легкий объект как промежуточный.

Вопрос

Является ли XElement действительно типом, который я хочу использовать в моей службе WCF, или есть лучший тип. Xml, который должен быть передан в службу, должен быть полным документом. Кроме того, у меня возникли проблемы с загрузкой xml-документов в виде XElement. Я думаю, что я должен открыть полный тип документа xml в классе легкого веса для службы, но я немного запутался в различиях между XDocument и XmlDocument.

Кроме того, я не могу раскрывать класс Message WCF со свойством типа XDocument, потому что он содержит свойство типа XDeclaration, которое не может быть сериализовано.

Если я использую XmlDocument, я должен сделать это странное преобразование типов xml в моем переводе между классом Linq и легким классом.

 XmlDocument doc = new XmlDocument();
 doc.LoadXml(message.MessageXml.ToString());

 MessageEnvelope retVal = new MessageEnvelope()
 {
      MessageXml = doc,
 };

XmlDocument кажется правильным, и я знаю, что мне нужно будет сделать какой-то перевод, но вы хотите как можно ближе подойти к нему.

Теги:
wcf
xmldocument
xelement

4 ответа

3
Лучший ответ

Вы можете использовать XElement или XmlElement:

public XmlElement GetXmlElement()
{
    var doc = new XmlDocument();
    doc.Load(PREFIX + @"Enumerations.wsdl");

    return doc.DocumentElement;
}

public XElement GetXElement()
{
    var doc = XDocument.Load(PREFIX + @"Enumerations.wsdl");
    return doc.Root;
}

Вы не хотите ни XDocument, ни XmlDocument. Помните, что все, что вы вернете, будет находиться в середине документа XML, содержащего конверт SOAP. У вас не может быть документ внутри документа, поэтому вам нужен элемент.

3
Джон Сондерс на деньги здесь. Чтобы немного разобраться, если вы посмотрите на WSDL, который создается при возврате либо XmlElement, либо XElement, вы увидите что-то вроде этого:
<xs:complexType>
  <xs:sequence>
    <xs:any minOccurs="0" processContents="lax"/>
  </xs:sequence>
</xs:complexType>

Что это. В основном это означает, что любой XML может идти здесь. Это также означает, что, вопреки предложению Чансика, он не привязывает тип возвращаемого значения к определенному типу .NET.

Итак, вам не нужно использовать строку.

-1

Используйте любой тип, необходимый для сериализации класса (String всегда работал хорошо для меня), а затем выполняйте конверсии, когда это необходимо, на сервере или на стороне клиента, чтобы поддерживать целостность документа. Вы также можете создать XDocument из одного или нескольких XElements, поэтому я бы пошел с XElement.

В худшем случае вы даже можете переопределить поведение сериализации вашего класса (не слишком страшно, если вы хороши с отражением).

XmlDocument - это старый, не Linq-документ. Они - одна и та же концепция, реализованная в разных классах.

  • 1
    -1: XML - это не то же самое, что строка. Не используйте его для представления XML.
  • 0
    Я знаю, поэтому вы должны проверить его до и после преобразования для сериализации ...
-2

В общем случае XDocument и XElememnt предпочтительнее XmlDocument и XmlElement с точки зрения производительности.

Однако я бы предложил использовать string для отправки XML-документа через службу WCF по следующим причинам:

  • Interoperability
    • Клиенты не привязаны к определенной версии платформы .NET(клиент может использовать XDocument или XmlDocument. Даже поддерживаемые Java-клиенты могут поддерживаться, если службы WCF настроены таким образом).
  • Правильно обрабатывать объявление Xml, если в нем содержится исходный XML-документ.

Примечание. Обязательно настройте конфигурацию для поддержки большого XML-документа. Например, максимальный размер сообщения basicHttpBinding по умолчанию - 64 КБ.

  • 1
    -1: полная чушь Просто отправьте XmlElement. Что в этом плохого? Он просто отправляет XML.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню