我使用 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/