WCF Restful Web Service序列化可数据为XML

时间:2013-05-11 19:24:46

标签: c# wcf rest

我正在使用框架4.0的WCF restful webservice。我想将数据表序列化为XML并返回生成的XML。我有这个工作,但我不禁觉得有更好的方法。

我最初开始做以下事情:

[WebGet(UriTemplate = "")]
public DataTable helloWorld()
{
    using (DataTable dt = new DataTable("Test"))
    {
        dt.Columns.Add("Message");
        dt.Rows.Add(dt.NewRow());
        dt.Rows[0]["Message"] = "Hello World";

        return dt;
    }
}

这给了我以下不良后果:

<DataTable xmlns="http://schemas.datacontract.org/2004/07/System.Data">
  <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns=""     xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Test" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="Test">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Message" type="xs:string" minOccurs="0"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <DocumentElement xmlns="">
      <Test diffgr:id="Test1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
        <Message>Hello World</Message>
      </Test>
    </DocumentElement>
  </diffgr:diffgram>
</DataTable>

经过一些修修补补后,我想出了以下代码,这有点笨重。有没有更好的办法?为什么我不能处理内存流?我有内存泄漏吗?

[WebGet(UriTemplate = "")]
public Stream helloWorld()
{
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";

    using (DataTable dt = new DataTable("Test"))
    {
        dt.Columns.Add("Message");
        dt.Rows.Add(dt.NewRow());
        dt.Rows[0]["Message"] = "Hello World";

        using (StringWriter sw = new StringWriter())
        {
            dt.WriteXml(sw, System.Data.XmlWriteMode.IgnoreSchema, false);

            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(sw.ToString()));
            return ms;

            //this fails for some reason
            //using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(sw.ToString())))
            //    return ms;
        }
    }
}

这段代码给了我想要的结果(我对挑选根标签并不挑剔):

<DocumentElement>
  <Test>
    <Message>Hello World</Message>
  </Test>
</DocumentElement>

2 个答案:

答案 0 :(得分:1)

我建议使用WCF Data Services来执行此操作。它们实现了OData协议,这意味着它们是以一致且可移植的方式公开数据而构建的。可以对JSON或XML进行序列化。

样品:

  1. Beginner level
  2. A more comprehensive explanation and sample.

答案 1 :(得分:0)

我建议使用DataContract进行序列化:

这是一个很好的教程,说明如何执行此操作:http://www.codeproject.com/Articles/105273/Create-RESTful-WCF-Service-API-Step-By-Step-Guide

您可以创建一个合约界面,您可以在其中定义所有必要的方法。

在你的情况下是这样的:

namespace MyProject.HelloWorld {
    [ServiceContract]
    public interface IHelloWorld {
        [OperationContract]
        [WebGet(UriTemplate="", ResponeFormat=WebMessageFormat.Xml)]
        HelloWorldResult helloWorld();
    }

    [DataContract()]
    public class HelloWorldResult {
        [DataMember]
        public String Message {get; set;}
    }
}

只需在Service.svc中实现Interface IHelloWorld并返回HelloWorldResult类的新实例:

public HelloWorldResult helloWorld() {
   return new HelloWorldResult() {
       Message = "Hello World!"
   };
}

但是你必须告诉端点使用IHelloWorld服务合同作为合同(参见教程:http://www.codeproject.com/Articles/105273/Create-RESTful-WCF-Service-API-Step-By-Step-Guide - &gt;步骤6)

希望这有帮助

欢呼声