如何在RESTful .NET WCF Web服务中返回XML?

Ang*_*loS 1 .net c# xml asp.net wcf

我使用4.0框架在Visual Web Developer 2010 Express中设置了WCF Web服务,并使用本教程将其转换为RESTful服务。

我可以根据自己的喜好修改它,以接受url参数,如下所示:

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

我遇到的问题是,尝试返回这样的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; 
    }

}
}
Run Code Online (Sandbox Code Playgroud)

我知道必须有一种更好的方法来建立XML文档并返回它。任何帮助将不胜感激!

先感谢您!!

Che*_*eso 5

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

我认为您要退货的内容如下:

<People>
  <Person Name="Nick"/>
  <Person Name="Bonnie"/>
</People>
Run Code Online (Sandbox Code Playgroud)

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

<People>
  <Person><Name>Nick</Name></Person>
  <Person><Name>Bonnie</Name></Person>
</People>
Run Code Online (Sandbox Code Playgroud)

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

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

然后,类型应如下所示:

[DataContract]
public class Person
{
    [DataMember]
    public string Name { get; set; }
}

[CollectionDataContract(Name = "People")]
public class People : List<Person>
{
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为混乱是因为您不需要GetXML方法。如果您的服务仅返回Person(或List &lt;Person&gt;),则WCF为您执行XML任务。:) (2认同)