我正在使用框架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>
答案 0 :(得分:1)
我建议使用WCF Data Services来执行此操作。它们实现了OData协议,这意味着它们是以一致且可移植的方式公开数据而构建的。可以对JSON或XML进行序列化。
样品:
答案 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)
希望这有帮助
欢呼声