2012-01-21 96 views
0

我想更新一些WCF服务方法,返回字符串以返回XmlDocument对象。我试着按原样返回并将其封装在datacontract对象中。无论哪种方式,我尝试更新服务引用时发生错误。该错误建议将其封装在一个数据合同中,并附上我正在执行的操作合同。这有什么窍门吗?从WCF服务返回XmlDocument不工作

+0

诀窍是:不要这样做。或者返回字符串,或者更好:为什么你要返回像XML这样笨重的东西? Web服务的重点在于它们将XML goo抽象出来 - 您应该使用正确的业务对象(及其列表)。 –

+0

我同意 - 你不应该像XmlDocument一样返回类型。 –

+0

如果你真的想有一个解决方案或回答你的问题,我建议你用你的代码的例子,编译器的错误消息更新你的问题。 – Kyberias

回答

2

有一种方法返回一个的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(); 
    } 
} 
1

如果你希望能够通过任意XML上线做的是使用的XElement而不是XmlDocument的最好的办法

的XmlDocument是不可序列