Skip to main content
 首页 » 编程设计

c#之如何在 RESTful .NET WCF Web 服务中返回 XML

2024年01月25日24tintown

我使用 4.0 Framework 在 Visual Web Developer 2010 Express 中设置了 WCF Web 服务并将其转换为 RESTful 服务 using this tutorial

我可以根据自己的喜好修改它以接受这样的 url 参数:

namespace RestServicePublishing 
{ 
[ServiceContract] 
public interface IRestService 
{ 
    [OperationContract(Name="GetXML")] 
    [WebGet(UriTemplate = "/{param1}/{param2}")] 
    XmlDocument GetXML(string param1, string param2); 
} 
} 

我遇到的问题是,在尝试返回这样的 XML 文档时出现“无法序列化类型‘System.Xml.XmlDocument’”错误:

namespace RestServicePublishing 
{ 
public class RestService : IRestService 
    { 
 
    public  XmlDocument GetXML(string param1, string param2) 
    { 
 
        //I am not using the parameters currently, I would just like to see if  
        //i can return XML first with this simple example: 
 
        StringBuilder sb = new StringBuilder(); 
        System.Xml.XmlWriter writer = XmlWriter.Create(sb); 
        writer.WriteStartDocument();  
        writer.WriteStartElement("People"); 
        writer.WriteStartElement("Person");  
        writer.WriteAttributeString("Name", "Nick");  
        writer.WriteEndElement();  
        writer.WriteStartElement("Person");  
        writer.WriteStartAttribute("Name");  
        writer.WriteValue("Nick");  
        writer.WriteEndAttribute();  
        writer.WriteEndElement(); 
        writer.WriteEndElement();  
        writer.WriteEndDocument();  
        writer.Flush(); 
 
        XmlDocument xmlDocument = new Xml.XmlDocument();  
        xmlDocument.LoadXml(sb.ToString()); 
        return xmlDocument;  
    } 
 
} 
} 

我知道必须有更好的方法来设置 XML 文档并返回它。非常感谢任何帮助!

提前致谢!

请您参考如下方法:

是的 - 好吧...... WCF 的模型说你不应该尝试返回 XmlDocument 本身。相反,您返回一个在您的编程环境中定义的自定义类型。需要标记该类型以指定应如何将其序列化为 XML。然后,当该方法返回自定义类型时,WCF 将其隐式序列化为 XML 文档。

我想你想要返回的是这样的:

<People> 
  <Person Name="Nick"/> 
  <Person Name="Bonnie"/> 
</People> 

但是 DataContractSerializer 不喜欢发出属性。因此,以正常方式使用 WCF 生成 XML Web 服务,您将得到如下内容:

<People> 
  <Person><Name>Nick</Name></Person> 
  <Person><Name>Bonnie</Name></Person> 
</People> 

为此,请像这样编写 C# 代码:

namespace RestServicePublishing 
{ 
    [ServiceContract] 
    public interface IRestService 
    { 
        [OperationContract(Name="GetXML")] 
        [WebGet(UriTemplate = "/{param1}/{param2}")] 
        List<Person> GetXML(string param1, string param2); 
    } 
} 

那么类型应该是这样的:

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 
 
[CollectionDataContract(Name = "People")] 
public class People : List<Person> 
{ 
}