WCF 休息服务.. 将数据表转换为 XML
Posted
技术标签:
【中文标题】WCF 休息服务.. 将数据表转换为 XML【英文标题】:WCF Rest Service.. Convert Datatable to XML 【发布时间】:2018-01-05 19:21:16 【问题描述】:我正在构建一个可以返回 XML 和 Json 的 WCF 休息服务。它可以工作,但是当我调用返回 XML 时,我的 XML 是一个字符串而不是 XML。我认为这是因为我正在将数据表转换为 XML。
WCF 以适当的 XML 提供响应,因此我不确定如何将 Datatable XML/文本放入 WCF XML 响应中并使其成为实际的 XML。
这是我的代码...如果需要我可以提供更多... 我相信我正在解决这个问题,但我错过了一些东西。 任何帮助将不胜感激。
IRest.vb
<OperationContract()>
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Xml,
BodyStyle:=WebMessageBodyStyle.Bare,
UriTemplate:="xml/getassetnames/?key=key")>
Function GetAssetNamesXML(key As String) As String
数据表转XML功能
Public Shared Function ToXml(dt As DataTable) As String
Using textWriter = New StringWriter()
Dim settings = New XmlWriterSettings()
settings.Indent = True
settings.IndentChars = " "
settings.OmitXmlDeclaration = True
Using xmlWriter__1 = XmlWriter.Create(textWriter, settings)
dt.WriteXml(xmlWriter__1)
Return textWriter.ToString()
End Using
End Using
End Function
实现 GetAssetNames IRest .. my .svc
Public Function GetAssetNamesXML(ByVal Key As String) As String Implements IAquaViewRest.GetAssetNamesXML
Dim dt As New DataTable
dt = GetAssetNamesDT(Key) 'runs a function that goes to the database and returns a DT
Return ToXml(dt)
dt.Clear()
End Function
【问题讨论】:
【参考方案1】:我没有收到任何回复,但想发布我的解决方案,以便其他人可以使用它。
主要问题是在操作合约中为函数使用字符串并将 DT 转换为 XML,然后将响应设置为 XML 双重序列化它。不确定我是否使用了正确的术语,但基本上它用字符串标签封装了您的 DT,就是这样。
因此,解决此问题的方法是将您的操作合同设置为 System.IO.Stream。这也意味着您将需要一个更好的将 DT 转换为 XML 的函数..
这是最终代码...
<OperationContract()>
<WebInvoke(Method:="GET", BodyStyle:=WebMessageBodyStyle.Wrapped, ResponseFormat:=WebMessageFormat.Xml,
UriTemplate:="xml/getassetnames/?key=key")>
Function GetAssetNamesXML(key As String) As System.IO.Stream
DT 到 XML
Public Shared Function ToXml(dt As DataTable) As String
Dim settings = New XmlWriterSettings()
settings.Indent = True
settings.Encoding = Encoding.GetEncoding("utf-8")
settings.IndentChars = " "
Dim memStream As New MemoryStream()
Dim writer As XmlWriter = XmlWriter.Create(memStream, settings)
Using xmlWriter__1 = XmlWriter.Create(memStream, settings)
dt.WriteXml(xmlWriter__1)
Dim xml As String = Encoding.GetEncoding("utf-8").GetString(memStream.ToArray())
Return xml
End Using
End Function
svc.vb
Public Function GetAssetNamesXML(ByVal Key As String) As System.IO.Stream Implements IAquaViewRest.GetAssetNamesXML
Dim dt As New DataTable
dt = GetAssetNamesDT(Key)
Dim TempStr As String = ToXml(dt)
Dim resultBytes As Byte() = Encoding.UTF8.GetBytes(TempStr)
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain"
Return New MemoryStream(resultBytes)
dt.Clear()
End Function
【讨论】:
以上是关于WCF 休息服务.. 将数据表转换为 XML的主要内容,如果未能解决你的问题,请参考以下文章
如何将 AsyncTask 转换为 Retrofit 以从 Android 中的 WCF Webservice 获取数据