从WCF服务返回XmlDocument不起作用

时间:2012-01-21 07:03:03

标签: wcf xmldocument datacontract

我正在尝试更新一些返回字符串以返回XmlDocument对象的WCF服务方法。我已经尝试将其原样返回并将其封装在datacontract对象中。无论哪种方式,我在尝试更新服务引用时遇到错误。该错误建议将其封装在具有我正在执行的操作合同的数据合同中。这有诀窍吗?

2 个答案:

答案 0 :(得分:2)

有一种方法可以从WCF返回XmlDocument,但是您需要使用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();
    }
}

答案 1 :(得分:1)

如果您希望能够在线路上传递任意XML,最好的方法是使用XElement而不是XmlDocument

XmlDocument不可序列化