2017-07-30 34 views
0

我有一個WCF REST服務,我建立,可以返回XML和JSON。它可以工作,但是當我打電話來返回XML時,我的XML是一個不是XML的字符串。我認爲這是因爲我正在將數據錶轉換爲XML。WCF REST服務..轉換數據表到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豪中豪..我的.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 

回答

0

我沒有得到任何迴應,但希望發佈我的解決方案,以便其他人可以有希望地使用它。

的主要問題是,使用在操作合同的功能的串並轉換一個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