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的主要内容,如果未能解决你的问题,请参考以下文章

WCF 休息服务不返回 JSON 数据。但它适用于 XML

wcf 休息服务响应中的 xml 被更改 为啥?

想将图像从 android 发布到 WCF 休息服务

为 WCF REST 服务生成示例数据?

如何将 AsyncTask 转换为 Retrofit 以从 Android 中的 WCF Webservice 获取数据

删除不工作在 WCF 休息服务抛出 (405) 方法不允许