【问题标题】:Returning XmlDocument from WCF service not working从 WCF 服务返回 XmlDocument 不起作用
【发布时间】:2012-02-15 14:28:55
【问题描述】:

我正在尝试更新一些返回字符串以返回 XmlDocument 对象的 WCF 服务方法。我尝试按原样返回它并将其封装在数据合同对象中。无论哪种方式,我在尝试更新服务参考时都会遇到错误。该错误建议将其与我正在执行的操作合同一起封装在数据合同中。这有什么诀窍吗?

【问题讨论】:

  • 诀窍是:不要这样做。要么按原样返回字符串,要么更好:为什么要返回像 XML 这样的笨重的东西? Web 服务的重点是它们抽象出 XML 粘性 - 您应该使用适当的业务对象(及其列表)。
  • 我同意 - 您不应该通过网络返回 XmlDocument 之类的类型。
  • 如果你真的想有一个解决方案或回答你的问题,我建议你用你的代码示例、编译器的错误消息等来更新你的问题。
  • @marc_s 这可能是一个术语,但我将“业务对象”关联为一个域对象,我建议人们不要把它放在服务边界上。相反,我告诉人们使用数据传输对象来定义消息有效负载并在这些对象和域对象之间进行映射。使用域对象会限制您在业务层中可以执行的操作
  • @RichardBlewett:这绝对只是术语——我使用的是“业务对象”而不是原始 XML。我同意在服务边界上使用 DTO

标签: wcf xmldocument datacontract


【解决方案1】:

有一种方法可以从 WCF 返回 XmlDocument,但您需要使用 XmlSerializer 而不是默认的序列化程序 (DataContractSerialier) - 下面的代码显示了它是如何完成的。话虽如此,请考虑使用 cmets 中提到的数据传输对象,除非您的场景确实需要传输 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();
    }
}

【讨论】:

    【解决方案2】:

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

    XmlDocument 不可序列化

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      相关资源
      最近更新 更多