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

标签 c# .net asp.net xml wcf

我使用 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>
{
}

关于c# - 如何在 RESTful .NET WCF Web 服务中返回 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412871/

相关文章:

如果记录也存在,Javascript 无法按函数预期工作

c# - PyEphem(日出/日落时间计算)等价于 C#

c# - 如何使窗口具有任务栏文本但没有标题栏

c# - 使用 Image.FromFile 不会释放文件句柄

c# - 转换器不转换文化数字格式?

c# - 在页面加载时调用 Javascript

mysql - Crystal 报表(运行时 13.0.2)未释放与 MySql 服务器的 ODBC 连接

c# - 从 CSProj 列表生成解决方案文件

c# - OrderBy in Include child 使用 EF Core

c# - 在 DataGridView 中搜索数据时出现 NullReferenceException