2009-06-18 3 views
2

Текущая реализацияЧто такое подходящий тип XML для веб-сервиса?

Sql Server 2005 Database с таблицей называется сообщениями с колонке под названием MessageXml типа XML.

Проект библиотеки C# с классом 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 кажется, правильная, и я знаю, что я должен буду сделать некоторый перевод, но хочу, чтобы получить как можно ближе к соответствующим, насколько это возможно.

ответ

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

-1

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

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

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

+1

-1: XML - это не то же самое, что строка. Не используйте его для представления XML. –

+0

Я знаю, поэтому вам нужно проверить его до и после преобразования для сериализации ... – marr75

-2

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

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

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

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

+1

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

3

John Saunders находится здесь на деньги. Выработать немного, если вы посмотрите на WSDL, который генерируется при возврате либо XmlElement или XElement, вы увидите что-то вроде этого:

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^