Какой тип XML подходит для веб-службы? - PullRequest
2 голосов
/ 18 июня 2009

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

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

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

Веб-служба WCF, предоставляющая класс MessagePayload со свойством MessageXml типа XElement.

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

Вопрос

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

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 10 декабря 2009

Джон Сондерс здесь на деньги. Чтобы уточнить, если вы посмотрите на WSDL, который генерируется, когда вы возвращаете XmlElement или XElement, вы увидите что-то вроде этого:

<xs:complexType>
  <xs:sequence>
    <xs:any minOccurs="0" processContents="lax"/>
  </xs:sequence>
</xs:complexType>

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

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

3 голосов
/ 27 июля 2009

Вы можете использовать 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. Вы не можете иметь документ внутри документа, поэтому вам нужен элемент.

0 голосов
/ 27 июля 2009

Как правило, XDocument и XElememnt предпочтительнее, чем XmlDocument и XmlElement с точки зрения производительности.

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

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

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

0 голосов
/ 18 июня 2009

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

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

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

...