[英]How do I return XML in a RESTful .NET WCF Web Service?
我使用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);
}
}
我遇到的问题是,尝试返回这样的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>
{
}
将其作为字符串返回,然后将该字符串加载到另一端的XmlDocument
中。
或者最好创建一个模仿代码中XML结构的DataContract
类,然后WCF会为您将其转换为XML。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.