Вы можете просто вернуть XmlElement - возможно, свойство DocumentElement экземпляра XmlDocument.
Вам не нужно использовать XmlSerializer для этого . DataContractSerializer является значением по умолчанию и отправит обратно XmlElement очень хорошо. Вам не нужно реализовывать IXmlSerializable.
следующий пример кода
Сервисный интерфейс:
using System;
using System.Xml;
using System.ServiceModel;
using System.Runtime.Serialization;
namespace Cheeso.Samples.Webservices
{
[ServiceContract(Namespace="urn:Cheeso.Samples" )]
public interface IService
{
[OperationContract]
XmlElement Register(String request);
}
}
Обратите внимание, у меня нет DataContract (и, следовательно, нет DataMembers), потому что я отправляю обратно экземпляр предопределенного класса (XmlElement).
Это реализация сервиса:
using System;
using System.Xml;
using System.ServiceModel;
namespace Cheeso.Samples.Webservices._2009Jun01
{
public class Results
{
public int Id;
public Int64 WorkingSet;
public String Name;
public String Title;
}
[ServiceBehavior(Name="WcfXmlElementService",
Namespace="urn:Cheeso.Samples",
IncludeExceptionDetailInFaults=true)]
public class WcfXmlElementService : IService
{
int index = 0;
public XmlElement Register(string request)
{
XmlDocument doc = new XmlDocument();
// can get the doc from anywhere. We use a LINQ-to-Objects result.
// do the LINQ thing
var processInfo =
from p in System.Diagnostics.Process.GetProcesses()
select new Results {
Id = p.Id,
WorkingSet = p.WorkingSet64,
Name = p.ProcessName,
Title = p.MainWindowTitle
};
// Note: cannot use an anonymous ilist if we will use XmlSerializer
// serialize that list into the XmlDocument
using (XmlWriter writer = doc.CreateNavigator().AppendChild())
{
var L = processInfo.ToList();
XmlSerializer s1 = new XmlSerializer(L.GetType());
s1.Serialize(writer, L);
}
index++;
// Append some additional elements to the in-memory document.
XmlElement elem = doc.CreateElement("id");
elem.InnerText = System.Guid.NewGuid().ToString();
doc.DocumentElement.AppendChild(elem);
elem = doc.CreateElement("stamp");
elem.InnerText = DateTime.Now.ToString("G");
doc.DocumentElement.AppendChild(elem);
elem = doc.CreateElement("in-reply-to");
elem.InnerText = request;
doc.DocumentElement.AppendChild(elem);
return doc.DocumentElement;
}
}
}
Клиент, если вы используете .NET, получает XmlElement. Если вы используете какой-либо другой стек, это будет просто XmlElement или XmlNode в этом стеке.
XSD для ответного сообщения является общим, как это:
<xs:element name="RegisterResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="RegisterResult" nillable="true">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" processContents="lax" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>