Есть способ вернуть XmlDocument из WCF, но вам нужно использовать XmlSerializer
вместо сериализатора по умолчанию (DataContractSerialier
) - код ниже показывает, как это можно сделать. Тем не менее, рассмотрите возможность использования объектов передачи данных, как указано в комментариях, если ваш сценарий действительно не требует передачи XmlDocument.
public class StackOverflow_8951319
{
[ServiceContract]
public interface ITest
{
[OperationContract]
string Echo(string text);
[OperationContract, XmlSerializerFormat]
XmlDocument GetDocument();
}
public class Service : ITest
{
public string Echo(string text)
{
return text;
}
public XmlDocument GetDocument()
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(@"<products>
<product id='1'>
<name>Bread</name>
</product>
<product id='2'>
<name>Milk</name>
</product>
<product id='3'>
<name>Coffee</name>
</product>
</products>");
return doc;
}
}
static Binding GetBinding()
{
var result = new WSHttpBinding(SecurityMode.None);
//Change binding settings here
return result;
}
public static void Test()
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
host.AddServiceEndpoint(typeof(ITest), GetBinding(), "");
host.Open();
Console.WriteLine("Host opened");
ChannelFactory<ITest> factory = new ChannelFactory<ITest>(GetBinding(), new EndpointAddress(baseAddress));
ITest proxy = factory.CreateChannel();
Console.WriteLine(proxy.Echo("Hello"));
Console.WriteLine(proxy.GetDocument().OuterXml);
((IClientChannel)proxy).Close();
factory.Close();
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}