Текущая реализация
База данных 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 кажется правильным, и я знаю, что мне нужно будет сделать какой-то перевод, но вы хотите как можно ближе подойти к нему.
Вы можете использовать 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. У вас не может быть документ внутри документа, поэтому вам нужен элемент.
XmlElement
, либо XElement
, вы увидите что-то вроде этого:
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" processContents="lax"/>
</xs:sequence>
</xs:complexType>
Что это. В основном это означает, что любой XML может идти здесь. Это также означает, что, вопреки предложению Чансика, он не привязывает тип возвращаемого значения к определенному типу .NET.
Итак, вам не нужно использовать строку.
Используйте любой тип, необходимый для сериализации класса (String всегда работал хорошо для меня), а затем выполняйте конверсии, когда это необходимо, на сервере или на стороне клиента, чтобы поддерживать целостность документа. Вы также можете создать XDocument из одного или нескольких XElements, поэтому я бы пошел с XElement.
В худшем случае вы даже можете переопределить поведение сериализации вашего класса (не слишком страшно, если вы хороши с отражением).
XmlDocument - это старый, не Linq-документ. Они - одна и та же концепция, реализованная в разных классах.
В общем случае XDocument
и XElememnt
предпочтительнее XmlDocument
и XmlElement
с точки зрения производительности.
Однако я бы предложил использовать string
для отправки XML-документа через службу WCF по следующим причинам:
XDocument
или XmlDocument
. Даже поддерживаемые Java-клиенты могут поддерживаться, если службы WCF настроены таким образом).Примечание. Обязательно настройте конфигурацию для поддержки большого XML-документа. Например, максимальный размер сообщения basicHttpBinding
по умолчанию - 64 КБ.