繁体   English   中英

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

[英]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中。

通过WCF发送XML是否存在问题?

或者最好创建一个模仿代码中XML结构的DataContract类,然后WCF会为您将其转换为XML。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM