2017-02-01 45 views
0

我嘗試從VBA for Excel程序查詢VB.NET中的RESTful API。無法在VB.NET中反序列化XML

但是,我似乎無法正確反序列化XML。

在VBA方面,代碼如下:

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 
URL = "http://localhost:50261/api/values" 
objHTTP.Open "POST", URL, False 
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.0)" 
objHTTP.setRequestHeader "Content-type", "application/xml" 
objHTTP.send ("<?xml version=""1.0"" encoding=""UTF-8""?><KPISheet><site>mysite</site><unit>myunit</unit></KPISheet>)") 

正如你所看到的,我送什麼,我相信這是一個良好和非常簡單的XML文檔。

在VB.NET的一面,我有一個類,叫做KPISheet:

Public Class KPISheet 
    Public Site As String 
    Public Unit As String 
End Class 

而一個的WebAPI,以獲得 'POST':

Public Sub PostValue(<FromBody> oKPISheet As KPISheet) 
    Debug.Print("toto") 
End Sub 

如果我在設置斷點調試行,我可以看到oKPISheet是Nothing,XML文件沒有反序列化。

在輸出窗口,我得到了以下錯誤消息:

拋出異常: 'System.Runtime.Serialization.SerializationException' 在System.Runtime.Serialization.dll

我有試過並沒有標籤,但我無法得到它的工作。

+0

最後我改變了我的負荷,JSON,和多數民衆的工作就像一個魅力... – Maxime

回答

1

正如您所看到的,我發送了我認爲是格式良好且非常簡單的XML文檔。

很遺憾,您的假設是錯誤的:

<KPISheet>site>mysite</site> 

這是無效的XML。您缺少網站代碼的開頭<。您似乎還有一些關閉)作爲XML中的最後一個字符。

所以你可以嘗試發送有效的XML:

objHTTP.send("<?xml version=""1.0"" encoding=""UTF-8""?><KPISheet><site>mysite</site><unit>myunit</unit></KPISheet>") 

還要注意正確的內容類型應該是text/xml,而不是application/xml

objHTTP.setRequestHeader "Content-type", "text/xml" 

的同時也要記住,XML是大小寫敏感的,所以你應該大寫你的標籤名稱來匹配你的屬性名稱:

objHTTP.send("<?xml version=""1.0"" encoding=""UTF-8""?><KPISheet><Site>mysite</Site><Unit>myunit</Unit></KPISheet>") 

和最後但並非最不重要的Web API默認使用datacontract串行處理XML的,所以你需要包括命名空間:

objHTTP.send("<?xml version=""1.0"" encoding=""UTF-8""?><KPISheet xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/WebApplication1.ViewModels.KPISheet""><Site>mysite</Site><Unit>myunit</Unit></KPISheet>") 

不要忘記調整的命名空間,以配合您KPISheet類。

或者,如果你不想包含的命名空間,你可以切換XML序列化使用:

config.Formatters.XmlFormatter.UseXmlSerializer = true; 

如果你想使用數據合同串行器,讓您可以與相應的裝飾您的視圖模型屬性:

<DataContract(Namespace="")> 
Public Class KPISheet 
    <DataMember> 
    Public Site As String 
    <DataMember> 
    Public Unit As String 
End Class 
+0

不幸的是,它只是與複製/粘貼一個問題:( VBA代碼是好的 – Maxime

+0

見我upda關於內容類型標題。 –

+0

我試過了,沒有任何效果。感謝您的幫助 – Maxime